数据库春节技术年货
对带有排他锁的表的并发访问
成功地执行带有 IN EXCLUSIVE MODE 选项的 LOCK TABLE 语句之后,其他用户不可获得对该 指定表的锁。然而,当您尝试对那个表进行 DDL 操作时,如果一并发的会话(例如,通过打开游 标)正在访问同一表,则您可能收到 RSAM error -106。此错误还可影响某些 DDL 语句自动地在 这些表上放置的隐式的锁。
这可能是因为表锁不排除表访问。排他锁防止其他用户获得锁,但不防止那些等待释放该排他锁的 写操作打开该表,或对该表的 Dirty Read 操作。您可设置 IFX_DIRTY_WAIT 环境变量来指定 DDL 等待指定的秒数,以便 Dirty Read 操作提交或回滚。
当表中的一行或多行被排他锁锁定时,对其他用户的影响部分地取决于他们的事务隔离级别。除了 Dirty Read 隔离级别之外的所有其他隔离级别中的其他用户可能遇到锁定错误,比如,由于在指定 的时间限制内未释放锁,或由于发生死锁情况,导致事务失败。
在行级锁定影响一些行的表上,通过启用事务来在行级锁定的表中读取数据的最近提交的版本,可 降低锁定冲突的风险,而不是等待提交或回滚在那行上持有该锁的事务。这可通过几种不同的方法 实现,包括:
⚫ 从单个事务发出此 SQL 语句
SET ISOLATION TO COMMITTED READ LAST COMMITTED;
⚫ 对于使用 Committed Read 或 Read Committed 隔离级别的所有会话,请将 USELASTCOMMITTED 配置参数设置为 'ALL' 或 'COMMITTED READ',或者另发出 带有 'ALL' 或 'COMMITTED READ' 作为会话环境选项的 SET ENVIRONMENT USELASTCOMMITTED 语句。
⚫ 对于使用 Dirty Read 或 Read Uncommitted 隔离级别的所有会话,请将 USELASTCOMMITTED 配置参数设置为 'ALL' 或 'DIRTY READ',或者另发出带有
'ALL' 或 'DIRTY READ' 作为会话环境选项的 SET ENVIRONMENT USELASTCOMMITTED 语句。
⚫ 对于在数据库中为其定义 user.sysdbopen( ) 过程的用户,DBA 可定义那个过程来包括 SET ENVIRONMENT USELASTCOMMITTED 语句,此语句带有 'ALL' 或
'COMMITTED READ' 作为会话环境选项,且还发出 SET ISOLATION 语句来设置 Committed Read 作为隔离级别。
⚫ 对于在数据库中不存在为其定义 user.sysdbopen( ) 过程的用户,DBA 可定义 PUBLIC.sysdbopen 过程,该过程指定相同的 SET ENVIRONMENT USELASTCOMMITTED 和 SET ISOLATION 语句。
仅当行级锁定有效时,而不是当另一会话持有对整个表的排他锁时,此 LAST COMMITTED 隔离 特性才有用。当 LOCK TABLE 应用表级锁时,此特性对于指定的表不可用。要了解更多关于此 LAST COMMITTED 特性,为了并发访问有些行被排他锁锁定的表,且为了在可支持此特性的表的 种类上的限制的信息,请参阅 Committed Read 的 LAST COMMITTED 选项。
热门帖子
- 12025-12-01浏览数:182042
- 22023-05-09浏览数:24268
- 42023-09-25浏览数:17472
- 52020-05-11浏览数:16495