提到事务,你肯定会想到 ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天我们就来说说其中 I,也就是“隔离性”。
比如做数据备份的场景下就需要使用到这种隔离级别
在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。
假设一个值从 1 被按顺序改成了 2、3、4,在回滚日志里面就会有类似下面的记录。
当前值是 4,但是在查询这条记录的时候,不同时刻启动的事务会有不同的 read-view。如图中看到的,在视图 A、B、C 里面,这一个记录的值分别是 1、2、4,同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。对于 read-view A,要得到 1,就必须将当前值依次执行图中所有的回滚操作得到。
每次开启事务的时候,都会有不同的 read-view ,同一条记录可以对应多种不同的版本。MVCC,多版本并发控制。
当没有事务再需要用到这些回滚日志时,回滚日志会被删除。
事务时间越长,回滚段undo log 越大,造成内存资源的浪费。
同时在长事务中,也会一直保持着锁持有,在一些情况下可能会导致数据库出现崩溃。
两种
建议你总是使用 set autocommit=1, 通过显式语句的方式来启动事务