对带有排他锁的表的并发访问

成功地执行带有 IN EXCLUSIVE MODE 选项的 LOCK TABLE 语句之后,其他用户不可获得对该指定表的锁。然而,当您尝试对那个表进行 DDL 操作时,如果一并发的会话(例如,通过打开游标)正在访问同一表,则您可能收到 RSAM error -106。此错误还可影响某些 DDL 语句自动地在这些表上放置的隐式的锁。

这可能是因为表锁不排除表访问。排他锁防止其他用户获得锁,但不防止那些等待释放该排他锁的写操作打开该表,或对该表的 Dirty Read 操作。您可设置 IFX_DIRTY_WAIT 环境变量来指定 DDL 等待指定的秒数,以便 Dirty Read 操作提交或回滚。

当表中的一行或多行被排他锁锁定时,对其他用户的影响部分地取决于他们的事务隔离级别。除了 Dirty Read 隔离级别之外的所有其他隔离级别中的其他用户可能遇到锁定错误,比如,由于在指定的时间限制内未释放锁,或由于发生死锁情况,导致事务失败。

在行级锁定影响一些行的表上,通过启用事务来在行级锁定的表中读取数据的最近提交的版本,可降低锁定冲突的风险,而不是等待提交或回滚在那行上持有该锁的事务。这可通过几种不同的方法实现,包括:

仅当行级锁定有效时,而不是当另一会话持有对整个表的排他锁时,此 LAST COMMITTED 隔离特性才有用。当 LOCK TABLE 应用表级锁时,此特性对于指定的表不可用。要了解更多关于此 LAST COMMITTED 特性,为了并发访问有些行被排他锁锁定的表,且为了在可支持此特性的表的种类上的限制的信息,请参阅 Committed Read 的 LAST COMMITTED 选项