🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇
⭐ 事务隔离级别 ⭐
🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇
前言
这一部分有点八股的味,面试常问.
1. MySQL事务隔离级别
SQL标准定义了四种隔离级别,MySQL全都⽀持.这四种隔离级别分别是:
1. 读未提交(READUNCOMMITTED): 读未提交 ,也叫未提交读.该隔离级别的事务可以看到其他事务中 未提交的数据.
问题: 因为其他事务未提交的数据可能会发⽣回滚,但是该隔离级别却可以读到,我们把该级别读到的数 据称之为脏数据,这个问题称之为脏读.
2. 读提交(READCOMMITTED): 读已提交,也叫提交读. 该隔离级别的事务能读取到已经提交事务的数 据, 该隔离级别不会有脏读的问题.
问题: 在事务的执⾏中可以读取到其他事务提交的结果,所以在不 同时间的相同SQL查询可能会得到不同的结果,这种现象叫做不可重复读
3. 可重复读(REPEATABLEREAD): 事务不会读到其他事务对已有数据的修改,即使其他事务已提交.也 就可以确保同⼀事务多次查询的结果⼀致.
问题: 但是其他事务新插⼊的数据,是可以感知到的.这也就引 发了幻读问题.可重复读,是MySQL的默认事务隔离级别. ⽐如此级别的事务正在执⾏时,另⼀个事务成功的插⼊了某条数据,但因为它每次查询的结果都是 ⼀样的,所以会导致查询不到这条数据,⾃⼰重复插⼊时⼜失败(,因为唯⼀约束的原因,两个事务插入的主键设为同一个). 明明在事务 中查询不到这条信息,但⾃⼰就是插⼊不进去,这个现象叫幻读.
4. 串⾏化(SERIALIZABLE):序列化,事务最⾼隔离级别.它会强制事务排序,使之不会发⽣冲突,从⽽解 决了脏读,不可重复读和幻读问题,但因为执⾏效率低,所以真正使⽤的场景并不多.
2. Spring 中事务的隔离级别
Spring 中事务隔离级别有5种:
1. Isolation.DEFAULT :以连接的数据库的事务隔离级别为主.
2. Isolation.READ_UNCOMMITTED :读未提交
3. READ UNCOMMITTED Isolation.READ_COMMITTED :读已提交
4. Isolation.REPEATABLE_READ :可重复读
5. Isolation. SERIALIZABLE:串行化,
上边都是 和 mysql 对标的.