当前位置: 首页 > news >正文

MySQL事务——Java全栈知识(31)

1、事务的特性

原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

2、事务的隔离级别

未提交读 (Read uncommitted)是最低的隔离级别。通过名字我们就可以知首,在这种事务隔离级别下,一个事务可以读到另外一个事务未提交的数据。这种隔离级别下会存在幻读、不可重复读和脏读的问题。

提交读 (Read committed)也可以翻圣成读已提交,通过名字也可以分析出,在一个事务修改数据过程中,如果事务还没提交,其他事务不能读该数据。所以,这种隔离级别是可以避免脏读的发生的。

可重复读 (Repeatable reads), 由于提交读隔离级别会产生不可重复读的读现象。所以,比提交读更高一个级别的隔离级别就可以解决不可重复读的问题。这种隔离级别就叫可重复读。但是这种周离级别没办法彻底解决幻读。

可串行化 (Serializable)是最高的隔离级别,前面提到的所有的隔离级别都无法解决的幻读,在可串行化的隔离级别中可以解决。

image.png

3、undo log 和 redo log 的区别

1、redo log

[!note] 持久性

缓冲池(buffer pool): 主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),以一定频率刷新到磁盘,从而减少磁盘 IO,加快处理速度。
数据页(page): 是 InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16 KB。页中存储的是行数据。
image.png
如果我们事务提交之后存在了缓冲池里面还没有写入磁盘,此时数据库宕机了。那么就会导致内存也就是缓冲池中的数据丢失,我们就失去了事务的持久性。

此时 Mysql 就引入了 redo log 日志文件。
image.png
此时我们写入的操作变成了,
1、事务提交之后写入缓冲区(Buffer Pool)
2、缓冲区写入 redo log buffer
3、redo log buffer 写入到 redo log 磁盘
4、隔一段时间之后刷新缓冲区到磁盘
5、当数据库宕机的时候,调用 redo log 恢复 Buffer Pool 中的数据。

[!info]
这乍一看不还是需要一个事务调用一次磁盘 IO 吗?这不就失去了 Buffer Pool 的作用了?
注意:redo log buffer 写到 redo log 中的时候是调用的顺序的磁盘 IO,而 Buffer Pool 写入磁盘的时候调用的是随机磁盘 IO。所以说此处是保证安全性的情况下,优化性能。

2、undo log

[!note] 原子性,一致性

undo log 记录的是当前命令相反的命令也就是回滚日志,用于记录数据被修改前的信息 , 作用包含两个 : 提供回滚和 MVCC (多版本并发控制) 。undo log 和 redo log 记录物理日志不一样,它是逻辑日志。
可以认为当 delete 一条记录时,undo log 中会记录一条对应的 insert 记录,反之亦然,
当 update 一条记录时,它记录一条对应相反的 update 记录。当执行 rollback 时,就可以从 undo log 中的逻辑记录读取到相应的内容并进行回滚。

3、区别 :

redo log: 记录的是数据页的物理变化,服务宕机可用来同步数据
undo log :记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据
redo log 保证了事务的持久性,undo log 保证了事务的原子性和一致性

http://www.lryc.cn/news/386065.html

相关文章:

  • 2毛钱不到的2A同步降压DCDC电压6V频率1.5MHz电感2.2uH封装SOT23-5芯片MT3520B
  • Ubuntu安装、更新和删除软件
  • 消息队列kafka中间件详解:案例解析(第10天)
  • Linux高级编程——线程
  • 技术学习的奥秘与乐趣
  • 创新前沿:Web3如何颠覆传统计算机模式
  • 一文弄懂梯度下降算法
  • 确认偏差:金融市场交易中的隐形障碍
  • Linux系统之部署linkding书签管理器
  • springcloud-gateway 路由加载流程
  • 双减期末考试成绩怎么公布?
  • 2, 搭建springCloud 项目 测试demo
  • RabbitMQ消息积压比较厉害,然后突然丢弃
  • QT中的样式表.qss文件
  • HTML图片链接缓存问题解决
  • 一个人 三个月 干了二十万
  • 设计模式之【工厂模式、适配器模式】
  • 云计算:重塑数字时代的基石
  • C# SocketUDP服务器,组播
  • 上市公司绿色投资者原始数据+计算代码(2008-2022年)
  • Redis-主从复制-测试主从模式下的读写操作
  • Linux系统应用与设置(3):串口调试(minicom)
  • Qt | windows Qt6.5.3安卓环境搭建成功版(保姆级教程)
  • Chrome Extension如何让work flow在页面刷新、跳转继续执行任务
  • 数据库调优厂商 OtterTune 宣布停止运营
  • 4、面向对象-typescript
  • 大数据学习之分布式数据采集系统Flume学习
  • 谁用谁夸,为什么BI零售数据分析方案这么受欢迎?
  • 多路h265监控录放开发-(14)通过PaintCell自定义日历控件继承QCalendarWidget的XCalendar类
  • 安卓速度下载v1.0.5/聚合短视频解析下载