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

SQL Anywhere 11.0.1 (中文) » UltraLite - 数据库管理和参考 » UltraLite 简介 » UltraLite 隔离级别

 

隔离级别的副作用

因为缺省情况下,UltraLite 在 0 隔离级别下操作,所以可能出现以下副作用:

  • 执行 SELECT 语句时,不需要任何锁定操作。

  • 应用程序可以访问未提交的数据(也称为脏读)。在这种情况下,应用程序可以访问数据库中未提交的行,并且仍可以通过另一个事务获得回退。这种现象可以导致幻像行(在原始查询后添加的行,它们使在重复的查询中返回的结果集不同)。

    有关演示脏读影响的教程,请参见教程:脏读。有关演示幻像行的教程,请参见教程:幻像行

  • 应用程序可以执行非可重复的读取。在这种情况下,应用程序从数据库中读取行,然后继续执行其它操作。然后,第二个应用程序更新/删除该行并提交更改。如果第一个应用程序尝试重新读取原始行,它将收到已更新的信息或发现原始行已被删除。

    有关演示非可重复读取的影响的教程,请参见教程:非可重复读取

示例

请假设有两个连接(A 和 B),每个连接都有各自的事务。

  1. 当连接 A 使用查询的结果集时,UltraLite 将当前行的副本读取到缓冲区中。

    注意

    读取某行时不会锁定该行。如果连接 A 读取某行但不对其进行修改,则连接 B 仍可以修改此行。

  2. 当 A 修改当前行时,它更改的是缓冲区中的副本。当连接 A 调用 Update 方法或关闭结果集时,缓冲区中的副本就会写回到数据库。

  3. 在该行上会放置一个写锁定以防止其它事务对其进行修改。连接 A 执行提交前,不会提交此修改。

  4. 根据所做的修改,如果连接 B 读取当前行,可能会遇到以下情况:

    连接 A 的修改 结果1
    行已被删除。 连接 B 在结果集中获取下一行。
    行已被修改。 连接 B 获取行的最新副本。

    1 连接 A 和 B 使用的查询不包含临时表。临时表可能导致其它副作用。

另请参见