java 一个大事务下的新增、修改、查询_mysql 事务的实现原理[1]

本文深入探讨了MySQL中事务的隔离性,包括原子性、一致性、隔离性和持久性的概念。分析了脏读、不可重复读和幻读的区别,并详细解释了为什么在可重复读(Repeatable read)隔离级别下仍然可能出现幻读。文章介绍了MVCC(多版本并发控制)的工作原理,以及如何通过undo log和read view来实现事务的可重复读。此外,还讨论了重做日志(redo log)、回滚日志(undo log)在事务中的作用,以及它们如何确保数据的持久性和原子性。
摘要由CSDN通过智能技术生成

50ab3c5aac3a18e46beffa8ab659fd5d.png

原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability)

事务想要做到什么效果?

按我理解,无非是要做到可靠性以及并发处理

可靠性:数据库要保证当insert或update操作时抛异常或者数据库crash的时候需要保障数据的操作前后的一致,想要做到这个,我需要知道我修改之前和修改之后的状态,所以就有了undo log和redo log。

并发处理:也就是说当多个并发请求过来,并且其中有一个请求是对数据修改操作的时候会有影响,为了避免读到脏数据,所以需要对事务之间的读写进行隔离,至于隔离到啥程度得看业务系统的场景了,实现这个就得用MySQL 的隔离级别。

变量介绍

redo log:重做日志,用来实现事务的持久性,该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都会存到该日志中。•undo log:回滚日志,用于记录数据被修改前的信息。与redo read所记录的相反,read log记录数据被修改后的信息,undo log记录的是数据的逻辑变化。主要用于事务回滚,即遇到错误时可以回滚。•read view:主要用来做可见性判断的,即当我们做快照读select的时候会针对我们所查询的数据创建出一个read view来决定当前事务能看到的是哪个版本的数据,有可能是当前最新的数据,也有可能只允许你看undolog里面某个版本的数据,遵循可见性算法。主要是将要修改的数据的DB_TRX_ID取出来,与系统其他活跃ID做对比如果大于或者等于这些ID的话,就通过DB_ROLL_PTR指针去取出undolog上一层的DB_TRX_ID直到小于这些活跃事务的ID为止,这样就保证了我们获取的数据版本是是当前最稳定的版本

学习

1、脏读(读取了未提交的数据,针对单笔数据) 2、不可重复读(进行了读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值