原子性(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、不可重复读(进行了读