数据库中的事务隔离等级
事务隔离等级用于决定一个事务和其他事务中发生地数据修改的隔离程度。
这个概念属于数据库事务的ACID属性。ACID为原子性、一致性、隔离性和持久性。(Atomicity, Consistency, Isolation, Durability)
错读
SQL92标准中定义了三种错读的场景。
事务1(Transaction 1/T1)读取事务2(Transaction 2/T2)有可能已经改变的数据时:
-
当读取一个已被修改但没有提交的数据时,发生脏读
T2修改了一行数据但未提交时,T1读取了这行数据,如果T2实施了回滚,则T1读了一个从未存在过的数据。
-
当一个数据被读取两次且值发生变化时,发生不可重复读
T1读取一行数据后,T2修改并提交这行数据,接着T1再次尝试读取数据,T1有可能取到一个发生改变或被删除的数据
-
在一个事务中,执行了两次相同的查询语句,返回的行数不同时,发生幻读
T1读取到数行符合条件的数据,T2添加或删除了这类数据后,T1再次查询时读取到了不同行数的数据
隔离等级
共有四种隔离等级:读取未提交,读取已提交,可重读以及序列化读。他们由脏读、不可重复读、幻读定义而来。
- 读取未提交(Read uncommitted):所有读取都可能发生
- 读取已提交(Read committed):不可重复读和幻读可能发生
- 可重读(Repeatable read):幻读可能发生
- 序列化读(Serialize read):所有错读都不会发生
数据库管理系统的默认隔离等级
- 可重读:MySQL
- 读取已提交:PostgreSQL,Oracle,SQL Server
- 读取未提交:MongoDB