本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
隔离级别定义
ACID
中的“I”代表隔离。事务的隔离程度决定了其他并发事务对其所操作的数据的影响程度。
: 1992 SQL标准创建了Tx1
和 Tx2
之间可能发生的三种类型的交互(称为现象):
Dirty read
– 当Tx1
修改某个项目,然后Tx2
在Tx1
提交更改前读取该项目时,将发生这种情况。之后,如果Tx1
始终未成功提交该更改或将其回滚,则Tx2
读取的值从未进入数据库。Non-repeatable read
– 当Tx1
读取某个项目,然后Tx2
修改或删除该项目并提交更改,随后Tx1
尝试重新读取该项目时,将发生这种情况。此时,Tx1
将读取到与以前不同的值,或发现该项目已不存在。Phantom read
– 当Tx1
读取一组满足搜索条件的项目,然后Tx2
添加一个满足搜索条件的新项目,随后Tx1
重复该搜索时,将发生这种情况。此时,Tx1
将获得与之前不同的项目集。
这三种交互类型中的任何一种都可能导致数据库中的最终数据不一致。
: 1992 SQL 标准定义了四个隔离级别,就三种类型的相互作用及其可能产生的不一致性而言,它们具有不同的保证。在所有四个级别上,都可以保证事务完整执行或根本不执行:
READ UNCOMMITTED
– 允许所有三种交互类型(即脏读、不可重复读以及幻读)。READ COMMITTED
– 不可能出现脏读,但可能出现不可重复读和幻读。REPEATABLE READ
– 不可能出现脏读和不可重复读,但仍可能出现幻读。SERIALIZABLE
– 三种交互现象均不会发生。
多版本并发控制 (MVCC) 允许另一种隔离,即SNAPSHOT隔离。这保证事务对事务开始时就存在的数据快照进行操作,并且没有任何其他事务可以更改该快照。