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实现了高效的多版本并发控制,保证数据的一致性和隔离性。
版权归原作者 努力干饭的小鱼 所有, 如有侵权,请联系我们删除。