- 标准SQL的事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
- Mysql 的事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 否 | 是 |
可重复读(repeatable-read) | 否 | 否 | 否 |
串行化(serializable) | 否 | 否 | 否 |
- 标准SQL事务隔离级别的实现
事务隔离级别 | 实现方式 |
---|---|
读未提交(read-uncommitted) | 读不加锁、写加行级共享锁 |
不可重复读(read-committed) | 读加行级共享锁(读完马上释放)、写加行级排它锁 |
可重复读(repeatable-read) | 读加行级共享锁(等事务结束后释放)、写加行级排它锁 |
串行化(serializable) | 读加表级共享锁、写加表级排它锁 |
- Mysql事务隔离级别的实现
事务隔离级别 | 实现方式 |
---|---|
读未提交(read-uncommitted) | 读不加锁、写加行级共享锁 |
不可重复读(read-committed) | 读采用 MVCC、写加行级排它锁 |
可重复读(repeatable-read) | 读采用 MVCC、写加行级排它锁或 gap lock 和 next-key lock |
串行化(serializable) | 读加表级共享锁、写加表级排它锁 |
- 由对比我们可以看出,Mysql 的
MVCC
解决了Mysql并发事务中不可重复读的问题 gap lock
和next-key lock
通过给间隙范围加锁解决了Mysql并发事务中幻读的问题- 与传统SQL标准不同 Mysql 的 不可重复读(
read-committed
)通过使用MVCC解决了不可重复读的问题 - 与传统SQL标准不同 Mysql 的 可重复读(
repeatable-read
)通过使用MVCC解决了不可重复读的问题,通过行级排它锁或gap lock
和next-key lock
解决了幻读的问题