使用 SET LOCK MODE 语句来定义数据库服务器如何处理一个试图访问锁定了的行或表的进程。
此语句是对 SQL 的 ANSI/ISO 标准的扩展。
语法
元素 | 描述 | 限制 | 语法 |
seconds | 在发出错误之前,进程等待释放锁的最大秒数 | 仅当比系统缺省值更短时,才是有效的 | 精确数值 |
用法
当进程试图访问锁定了的行或表时,此语句可以下列方式定向数据库服务器的响应。
锁定方式 作用
NOT WAIT 数据库服务器立即结束操作并返回错误代码。这是缺省的情况。
WAIT 数据库服务器挂起进程,直到释放锁为止。
WAIT seconds 数据库服务器挂起进程,直到释放锁或直到等待期间结束为止。如果在等待期间之后该锁定保持,则操作结束并返回错误代码。
要获取本文档中术语锁模式的两种不同含意的描述,请参阅相关的概念部分中的“锁定颗粒度”。
要避免在尝试读取并发会话对其持有排他行级锁的操作中等待,您还可使用 LAST COMMITTED 特性,或者通过在 SET ISOLATION COMMITTED READ 语句中显式地设置它,或者通过设置 USELASTCOMMITTED 配置参数或 USELASTCOMMITTED 会话环境选项。
示例
在下例中,用户指定如果进程请求锁定了的行,则操作应立即结束并应返回错误代码:
SET LOCK MODE TO NOT WAIT;
在下例中,用户指定应挂起进程直到释放该锁为止:
SET LOCK MODE TO WAIT;
下一示例在任何等待的长度上设置上限 17 秒:
SET LOCK MODE TO WAIT 17;
WAIT 子句导致数据库服务器挂起进程,直到释放锁或直到未释放锁但已超过了指定的秒数为止。
当您请求 WAIT 选项时,数据库服务器为防止死锁的可能性提供保护。在数据库服务器挂起进程之前,它检查挂起进程是否会导致死锁。如果数据库服务器发现可能发生死锁,则终止该操作(否决您的等待指令)并返回错误代码。在疑似死锁或实际死锁的情况下,数据库服务器都返回错误。
请谨慎地使用无限制的等待期间,当您指定不带 seconds 的 WAIT 选项时会产生这种情况。如果您不指定上限,则放置了锁的进程会以某种方式不释放它,被挂起的进程可能无限地等待。由于不存在真的死锁状况,所以数据库服务器不采取纠正活动。
在网络环境中,DBA 使用 ONCONFIG 参数 DEADLOCK_TIMEOUT 来建立 seconds 的缺省值。如果您使用 SET LOCK MODE 语句来设置上限,则仅当您的等待期间比系统缺省值更短时,才应用您的值。
完整连接级别设置
SET LOCK MODE 语句支持完整连接级别设置。这意味着将在连接时刻本地会话环境中的值传播到所有新的或恢复的事务。这些可包括下列事务类型:
符合 XA 的注册在本地数据库中的数据源的全局事务。
如果您在事务内更改锁模式设置,则将新的值传播回本地环境以及所有随后的新的或恢复的事务。