MySQL Innodb 事务隔离级别
Reference
事务并发的可能问题与其解决方案
脏读、幻读、不可重复读和丢失更新
数据库并发事务存在的问题(脏读、不可重复读、幻读等)
对于脏读,不可重复读,幻读的一点理解,看懂红字很关键
MySQL 四种事务隔离级的说明
15.7.2.1 Transaction Isolation Levels
MySQL Innodb 事务隔离级别
【漫画】如何给新来的师妹解释什么是数据库的脏读、不可重复读和幻读
Understanding MySQL Isolation Levels: Repeatable-Read
SQL 多个事务并发时可能遇到的问题
Ioslation 事务四个隔离级别(层级递增)
Read Uncommitted 未提交读
通常是大部分数据库采用的默认隔离界别
定义
一个事务可以读取另一个事务并未提交的更新结果
解释
事务中的修改,即使没有提交,其他事务也可以看得到
作用
不可避免 脏读 dirty reads
,不可重复读 non-repeatable reads
,幻读 phantom reads
实现
可以通过写操作加“持续-X锁”实现。
Read committed 已提交读
通常是大部分数据库采用的默认隔离界别
定义
一个事务不会读到另一个事务已修改但未提交的数据
解释
一个事务的更新操作结果只有在该事务提交之后,另一个事务才可能读取到同一笔数据更新后的结果。
保证了一个事务不会读到另一个事务已修改但未提交的数据
作用
避免了 脏读 dirty reads
,不可避免 不可重复读取 non-repeatable reads
和 幻读 phantom reads
。
实现
可以通过写操作加“持续-X”锁,读操作加“临时-S锁”实现。
Repeatable read 可重复读
mysql (InnoDB) 默认隔离级别
定义
保证一个事务不会修改已经由另一个事务读取但未提交 (回滚) 的数据
解释
保证在整个事务的过程中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对同一笔数据进行更新,也不管其他事务对同一笔数据的更新提交与否。
作用
避免了 脏读 dirty reads
和 不可重复读取 non-repeatable reads
, 不可避免 幻读 phantom reads
。
实现
行锁
可以通过写操作加“持续-X”锁,读操作加“持续-S锁”实现。
- Serializable 可串行化
最严格的隔离级别
定义
所有的事务操作都必须顺序 (串行) 执行
解释
完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
避免其他隔离级别所遇到的所有问题,最安全,性能最差的隔离级别。
作用
并发度下降,吞吐量上不去,极大影响系统性能,很少场景会使用。
实现
表锁 | 范围锁
Isolation Level | Lost Updates | Dirty Reads | Non-repeatable Reads | Phantom Reads |
---|---|---|---|---|
read uncommitted | don't occur (不可能发生) | may occur (可能发生) | may occur | may occur |
read committed | don't occur | don't occur | may occur | may occur |
repeatable read | don't occur | don't occur | don't occur | may occur |
serializable | don't occur | don't occur | don't occur | don't occur |