数据库使用系列专栏:数据库使用系列文章
前面介绍了数据库事务的概念及其实现原理,为了提升系统的并发性能SQL标准定义了不同的事务隔离级别,从低到高依次是:
- 读未提交(READ UNCOMMITTED)
- 读已提交(READ COMMITTED)
- 可重复读(REPEATABLE READ)
- 串行化(SERIALIZABLE)
不同隔离级别可能导致的并发异常:
事务隔离级别 | 可能导致的并发异常 | ||
脏读 | 不可重复读 | 幻读 | |
读未提交(read-uncommitted) | 可能 | 可能 | 可能 |
不可重复读(read-committed) | 可能 | 可能 | |
可重复读(repeatable-read) | 可能 | ||
串行化(serializable) |
本文针对不同的隔离级别进行测试,以MySQL InnoDB存储引擎(默认事务级别可重复读,可重复读级别InnoDB引擎通过加锁设计已消除幻读可能)为例。
1 读未提交(read uncommitted)
2 读已提交(read committed)
3 可重复读(repeatable read)
4 串行化(serializable)
系统并行性能差,数据操作只能串行:不同事务读取可以同时操作(共享读),但不能增删改。
补充:不可重复读和幻读区别
1、不可重复读针对确定的某一行数据,幻读针对不确定的多行数据;
2、解决不可重复读加锁时只需要添加行级锁,解决幻读加锁需要添加表级锁。