目录
MySQL事务隔离级别
1. 读未提交(Read Uncommitted)
2. 读已提交(Read Committed)
3. 可重复读(Repeatable Read)(默认隔离级别)
4. 串行化(Serializable)
表格总结
MVCC
概念
工作原理
快照读
当前读
undo log日志版本链
readview
MySQL事务隔离级别
1. 读未提交(Read Uncommitted)
- 特性:最低的隔离级别,事务可以读取未提交的数据。
- 问题:会产生脏读(Dirty Read),即一个事务可以读到另一个事务未提交的数据变更。
- 适用场景:几乎不使用,因为它不能保证数据的一致性。
2. 读已提交(Read Committed)
- 特性:只能读取已经提交的数据,避免了脏读问题。
- 问题:可能会产生不可重复读(Non-repeatable Read),即同一事务中的两次读取操作可能会得到不同的结果,因为其他事务可能在中间提交了更新。
- 适用场景:多数数据库系统(如Oracle)默认的隔离级别,适用于读取数据一致性要求不高的场景。
3. 可重复读(Repeatable Read)(默认隔离级别)
- 特性:同一事务中多次读取相同数据时,结果是一样的,即使其他事务修改了数据并提交。在MySQL中是默认的隔离级别。
- 问题:可能会产生幻读(Phantom Read),即同一事务中的两次查询操作可能会因为其他事务插入了(或者删除了)新的行而得到不同的结果。
- 适用场景:大多数应用程序的默认选择,能较好地平衡并发性和一致性。
4. 串行化(Serializable)
- 特性:最高的隔离级别,通过对所有读取的数据加锁,强制事务串行执行,避免了脏读、不可重复读和幻读问题。
- 问题:并发性能较差,因为事务必须依次执行。
- 适用场景:需要严格一致性的数据操作场景,但因为性能开销较大,一般不常用。
表格总结
隔离级别 | 脏读 | 不可重复读 | 幻读 | 并发性 | 应用场景 |
---|---|---|---|---|---|
读未提交 | 可能 | 可能 | 可能 | 最高 | 几乎不用 |
读已提交 | 不可能 | 可能 | 可能 | 较高 | 读取一致性要求不高的场景 |
可重复读 | 不可能 | 不可能 | 可能 | 中等 | MySQL默认,适用于大多数应用程序 |
串行化 | 不可能 | 不可能 | 不可能 | 最低 | 数据严格一致性要求高的场景,但较少使用 |
MVCC
概念
多版本并发控制(MVCC)是一种用于数据库管理系统中处理并发的机制,旨在提高数据库的并发性能和数据一致性。MySQL中的InnoDB存储引擎采用MVCC来实现隔离级别(可重复读)。
工作原理
MVCC通过维护多个数据版本来允许并发的读写操作,而不需要加锁。 每个事务会看到一个数据的一致性快照,这个快照是在事务开始时生成的。
快照读
MVCC机制实现了快照读,普通select查询就是快照读,快照读到数据有可能不是最新的数据,它主要是为了实现可重复读的事务隔离级别。
当前读
在更新数据时读取的是当前最新的数据,而不是快照数据。
undo log日志版本链
它其实就是把每次修改的数据都会保存一份,然后在每条数据基础上增加两个隐藏列,trx_id,roll_pointer,分别存储当前事务ID和上一版本的数据地址。每次对数据进行修改时,InnoDB会将修改前的数据记录到undo log中,从而保留了数据的多个版本。通过undo log,事务能够回滚到之前的状态,以实现原子性。
readview
在可重复读的事务里面,这个readview视图由未提交的事务id数组和已创建的最大事务id(max_id)组成,因此这个最大的 max_id 可能在数组里面,也可能不在,因为事务最大的id可能先提交,而数组里面的id都是未提交的
[trx_id1,trx_id2],max_id
Undo log和read view是InnoDB实现MVCC的重要组件。undo log记录数据的历史版本,使得事务能够回滚和实现一致性读;read view用于事务读取数据时判断数据版本的可见性。通过这两者的结合,InnoDB实现了高效的多版本并发控制,保证数据的一致性和隔离性。