MySQL 四大隔离级别(从低到高)
读未提交(Read Uncommitted)
读已提交(Read Committed)
可重复读(Repeatable Read)
串行化(Serializable)
1. 读未提交(Read Uncommitted)
一个事务能读到另一个事务未提交的数据
问题:脏读
实际:基本不用
2. 读已提交(Read Committed)
只能读到别的事务已经提交的数据
解决:脏读
问题:不可重复读(同一事务内两次查询结果不一样)
实际:Oracle、SQL Server 默认
3. 可重复读(Repeatable Read)默认
同一个事务里,多次读取结果一致
解决:脏读、不可重复读
问题:幻读(InnoDB 靠 MVCC 很大程度避免了幻读)
实际:MySQL InnoDB 默认级别
4. 串行化(Serializable)
事务排队执行,完全串行
解决所有问题:脏读、不可重复读、幻读
问题:性能极差,并发基本废掉
实际:极少用,只有强一致场景才用
如何使用
# 当前会话级别(只对本次连接生效,断开就没)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
#全局级别(对新连接生效,已连接的不变)
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
#mysqld
transaction-isolation = READ-COMMITTED
MySQL 默认:可重复读(RR),靠 MVCC 实现
Oracle 默认:读已提交(RC),不支持真正的 RR
两者都支持:读未提交、读已提交、串行化
Oracle 设 REPEATABLE READ 等价于 SERIALIZABLE
隔离级别和悲乐锁的关系
隔离级别是目标,悲观锁、乐观锁是实现这个目标的两种方式。

image.png