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