因为缺省情况下,UltraLite 在 0 隔离级别下操作,所以可能出现以下副作用:
执行 SELECT 语句时,不需要任何锁定操作。
应用程序可以访问未提交的数据(也称为脏读)。在这种情况下,应用程序可以访问数据库中未提交的行,并且仍可以通过另一个事务获得回退。这种现象可以导致幻像行(在原始查询后添加的行,它们使在重复的查询中返回的结果集不同)。
应用程序可以执行非可重复的读取。在这种情况下,应用程序从数据库中读取行,然后继续执行其它操作。然后,第二个应用程序更新/删除该行并提交更改。如果第一个应用程序尝试重新读取原始行,它将收到已更新的信息或发现原始行已被删除。
有关演示非可重复读取的影响的教程,请参见教程:非可重复读取。
请假设有两个连接(A 和 B),每个连接都有各自的事务。
当连接 A 使用查询的结果集时,UltraLite 将当前行的副本读取到缓冲区中。
读取某行时不会锁定该行。如果连接 A 读取某行但不对其进行修改,则连接 B 仍可以修改此行。
当 A 修改当前行时,它更改的是缓冲区中的副本。当连接 A 调用 Update 方法或关闭结果集时,缓冲区中的副本就会写回到数据库。
在该行上会放置一个写锁定以防止其它事务对其进行修改。连接 A 执行提交前,不会提交此修改。
根据所做的修改,如果连接 B 读取当前行,可能会遇到以下情况:
连接 A 的修改 | 结果1 |
---|---|
行已被删除。 | 连接 B 在结果集中获取下一行。 |
行已被修改。 | 连接 B 获取行的最新副本。 |
1 连接 A 和 B 使用的查询不包含临时表。临时表可能导致其它副作用。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |