成功地执行带有 IN EXCLUSIVE MODE 选项的 LOCK TABLE 语句之后,其他用户不可获得对该指定表的锁。然而,当您尝试对那个表进行 DDL 操作时,如果一并发的会话(例如,通过打开游标)正在访问同一表,则您可能收到 RSAM error -106。此错误还可影响某些 DDL 语句自动地在这些表上放置的隐式的锁。
这可能是因为表锁不排除表访问。排他锁防止其他用户获得锁,但不防止那些等待释放该排他锁的写操作打开该表,或对该表的 Dirty Read 操作。您可设置 IFX_DIRTY_WAIT 环境变量来指定 DDL 等待指定的秒数,以便 Dirty Read 操作提交或回滚。
当表中的一行或多行被排他锁锁定时,对其他用户的影响部分地取决于他们的事务隔离级别。除了 Dirty Read 隔离级别之外的所有其他隔离级别中的其他用户可能遇到锁定错误,比如,由于在指定的时间限制内未释放锁,或由于发生死锁情况,导致事务失败。
SET ISOLATION TO COMMITTED READ LAST COMMITTED;
仅当行级锁定有效时,而不是当另一会话持有对整个表的排他锁时,此 LAST COMMITTED 隔离特性才有用。当 LOCK TABLE 应用表级锁时,此特性对于指定的表不可用。要了解更多关于此 LAST COMMITTED 特性,为了并发访问有些行被排他锁锁定的表,且为了在可支持此特性的表的种类上的限制的信息,请参阅 Committed Read 的 LAST COMMITTED 选项。