Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 创建数据库 » 使用事务和隔离级别 » 隔离级别和一致性

 

典型的不一致类型

有三种典型的不一致类型在执行并发事务的过程中可能会出现。这个列表并不完整,还可能会出现其它类型的不一致。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 参数


游标不稳定性