有三种典型的不一致类型在执行并发事务的过程中可能会出现。这个列表并不完整,还可能会出现其它类型的不一致。ISO SQL/2003 标准中提到了这三种类型,而且,较低隔离级别的行为是依据这些类型定义的,因此它们非常重要。
脏读 事务 A 修改了一行,但未提交或回退所做更改。事务 B 读取了被修改的行。之后,事务 A 在执行 COMMIT 之前又对该行进行了更改,或回退了所做更改。这两种情况下,事务 B 读取到该行时,该行都处于从未被提交的状态。
有关脏读的详细信息,请参见教程:脏读。
非可重复读取 事务 A 读取了一行。之后,事务 B 修改或删除了该行,并执行了 COMMIT 命令。事务 A 之后再次尝试读取同一行时,该行将已被更改或删除。
有关非可重复读取的详细信息,请参见教程:非可重复读取。
幻像行 事务 A 读取了一组满足某个条件的行。之后,事务 B 执行 INSERT 命令,或对以前不满足 A 的条件的一行执行 UPDATE 命令。事务 B 提交了这些更改。这些新提交的行现在满足事务 A 的条件。如果事务 A 之后重复读取操作,则它将获得更新的行集。
有关幻像行的详细信息,请参见教程:幻像行。
SQL Anywhere 允许脏读、非可重复读取和幻像行(取决于所使用的隔离级别)。下表中的 X 表示该隔离级别允许该行为。
隔离级别 | 脏读 | 非可重复的读取 | 幻像行 |
---|---|---|---|
0-读取未提交数据 | X | X | X |
只读语句快照 | X1 | X2 | X3 |
1-读取已提交数据 | X | X | |
语句快照 | X2 | X3 | |
2-可重复读取 | X | ||
3-可序列化 | |||
快照 |
1 如果 updatable_statement_isolation 选项指定的隔离级别不防止脏读的发生,则事务中的可更新语句可发生脏读。
2 如果 updatable_statement_isolation 选项指定的隔离级别不防止非可重复读取的发生,则事务中的语句可发生非可重复读取。非可重复读取之所以会发生,是因为每个语句启动一个新的快照,因此一个语句可能看到另一个语句看不到的更改。
3 如果 updatable_statement_isolation 选项指定的隔离级别不防止幻像行的发生,则事务中语句可发生幻像行。幻像行之所以会发生,是因为每个语句启动一个新的快照,因此一个语句可能看到另一个语句看不到的更改。
此表说明了以下两点:
每个隔离级别都消除了这三种典型的不一致类型中的一种。
每个级别都消除了所有较低级别所消除的不一致类型。
对于语句快照隔离级别,非可重复的读取和幻像行可在事务中发生,但不能在事务的单个语句中发生。
隔离级别在 ODBC 下具有不同的名称。这些名称是基于它们所防止的不一致的名称而命名的。请参见ValuePtr 参数。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |