Committed Read 的 LAST COMMITTED 选项

使用 Committed Read 隔离级别的 LAST COMMITTED 关键字选项来减小其他会话持有排他的行级锁的风险,该风险会导致应用的锁定错误失败,或直到提交或回滚并发的事务之后应用才能读锁定的行。

在应用尝试读取另一会话在其上持有排他锁的行的上下文中,这些关键字指导数据库服务器返回该行的最近提交的版本,而不是等待该锁被释放。

在下列任何环境之下,此特性隐式地在使用 SET ISOLATION 语句的 Committed Read 隔离级别的,或使用符合 ANSI/ISO 的 SET TRANSACTION 语句的 Read Committed 隔离级别的所有用户会话中生效:
在下列任何环境之下,此特性还隐式地在使用 SET ISOLATION 语句的 Dirty Read 隔离级别,或使用符合 ANSI/ISO 的 SET TRANSACTION 隔离级别的的所有用户会话中生效:

启用此特性不可消除锁定冲突的可能性,但它们减少其他会话读取同一行的场景可导致错误的数目。LAST COMMITTED 关键字仅对并发读操作有效。当并发的会话尝试写到同一行时,它们不可防止可发生的锁定冲突或错误。

在表的“最后提交的”版本不可用的上下文中,此特性对 Committed Read 或 Dirty Read 行为无效,包括: 不需要用户定义的访问方式来支持 LAST COMMITTED 特性。

LAST COMMITTED 语义的作用域既不是基于语句的,也不是基于事务的。此隔离级别与不带 LAST COMMITTED 选项的 Committed Read 隔离级别有相同的瞬间作用域。例如,当在生效的带有 LAST COMMITTED 的单个事务内执行查询两次时,可能通过相同的查询返回不同的结果,如果在查询的两次提交的间隔之间提交正在相同的数据上操作的其他 DML 事务的话。Committed Read 和 Committed Read Last Committed 语义的此瞬时特性恰好实现 ANSI/ISO Read Committed 隔离级别。

LAST COMMITTED 特性不支持通过表级锁的读取。如果使用 LAST COMMITTED 特性的查询的访问计划遇到它需要访问的表或索引中的表级锁,则该查询会返回下列错误代码:

SQL 错误代码:
252: Cannot get system information for table.
ISAM 错误代码:
113: ISAM error: the file is locked.