使用 Committed Read 隔离级别的 LAST COMMITTED 关键字选项来减小其他会话持有排他的行级锁的风险,该风险会导致应用的锁定错误失败,或直到提交或回滚并发的事务之后应用才能读锁定的行。
在应用尝试读取另一会话在其上持有排他锁的行的上下文中,这些关键字指导数据库服务器返回该行的最近提交的版本,而不是等待该锁被释放。
在下列任何环境之下,此特性隐式地在使用 SET ISOLATION 语句的 Committed Read 隔离级别的,或使用符合 ANSI/ISO 的 SET TRANSACTION
语句的 Read Committed 隔离级别的所有用户会话中生效:
- 如果 USELASTCOMMITTED 配置参数设置为 'COMMITTED READ' 或 'ALL'
- 如果 SET ENVIRONMENT 语句将 USELASTCOMMITTED 会话环境变量设置为 'COMMITTED READ' 或 'ALL'。
在下列任何环境之下,此特性还隐式地在使用 SET ISOLATION 语句的 Dirty Read 隔离级别,或使用符合 ANSI/ISO 的 SET TRANSACTION
隔离级别的的所有用户会话中生效:
- 如果 USELASTCOMMITTED 配置参数设置为 'DIRTY READ' 或 'ALL'
- 如果 SET ENVIRONMENT 语句将 USELASTCOMMITTED 会话环境变量设置为 'DIRTY READ' 或 'ALL'。
启用此特性不可消除锁定冲突的可能性,但它们减少其他会话读取同一行的场景可导致错误的数目。LAST COMMITTED 关键字仅对并发读操作有效。当并发的会话尝试写到同一行时,它们不可防止可发生的锁定冲突或错误。
在表的“最后提交的”版本不可用的上下文中,此特性对 Committed Read 或 Dirty Read 行为无效,包括:
- 数据库不支持事务日志记录
- 以 LOCK MODE PAGE 关键字创建了的表,或已更改为有一 IFX_DEF_TABLE_LOCKMODE 环境变量的锁模式设置为了 'PAGE'
- DEF_TABLE_LOCKMODE 配置参数设置为 'PAGE'
- LOCK TABLE 语句已显式地在表上设置了排他锁
- 未提交的 DDL 语句已隐式地在表上设置了排他锁
- 该表是在其上未提交的 DDL 语句已隐式地设置排他锁的系统目录表
- 该表有复合的数据类型的列或用户定义的数据类型的列
- 该表为 RAW 表
- DataBlade 模块正在访问该表
- 使用“虚拟表接口”创建了的表。
不需要用户定义的访问方式来支持 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.