在 SQL 标准中有四种事务隔离级别,下面以示例数据为基础,采用AB两条并发事务,理解四种隔离级别。
示例数据:
ID | 姓名 | |
1 | 张三 | |
2 | 李四 |
READ UNCOMMITED:
读取未提交事务,该隔离级别会导致当前事务读取到其他并发事务更新后但是未提交的事务,即脏读。
如:
事务A、B并发执行,A 将ID为1的记录姓名字段更新为张三1,但未提交,此时B事务如果读取该记录,返回的姓名也是张三1,就出现了脏读。
READ COMMITED:
读取已提交事务,解决了脏读,但是不能保证同一事务中,相同记录总是相同的值(当前记录可能被其他事务修改)
如:
事务A、B并发执行,A 将ID为1的记录姓名字段更新为张三1并提交,此时B读取到该记录最新值张三1,其后A又执行了一次更新,值变为张三2,B也能读取到最新值张三2,这样在同一事务中B对相同记录读取的值就不一样,便造成业务判断上的不一致。
REPEATABLE READ:
重复读事务,解决了脏读、重复读,保证同一事务中,相同记录总是读取相同值,但是就会出现幻读,当进行范围查询时,就会出现幻读。
如
事务A,B并发执行,A读取ID小于5的记录,其结果有两条,此时B新增一条记录ID为3,并且提交,同一事务中A再次读取ID小于5的记录就会返回3条,事务A就出现了幻读。
SERIALIZABLE:
串行化事务,解决了脏读、重复读、幻读,保证同一事务中,即使相同范围查询也会返回相同结果。
如
事务A,B并发执行,A读取ID小于5的记录,其结果有两条,此时B新增一条记录ID为3,并且提交,同一事务中A再次读取ID小于5的记录依然返回2条。
隔离级别安全性与事务执行性能成反比,在实际应用中应酌情考虑。最后附一张二维表。
脏读 | 重复读 | 幻读 | |
READ UNCOMMITED | 未解决 | 未解决 | 未解决 |
READ COMMITED | 已解决 | 未解决 | 未解决 |
REPEATABLE READ | 已解决 | 已解决 | 未解决 |
SERIALIZABLE | 已解决 | 已解决 | 已解决 |