Mysql &Oracle隔离级别

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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容