自定义锁超时

如果 Microsoft SQL Server 数据库引擎 实例由于其他事务已拥有资源的冲突锁而无法将锁授予给某个事务,则该事务被阻塞,等待现有锁被释放。默认情况下,没有强制的超时期限,并且除了尝试访问数据(有可能被无限期阻塞)外,没有其他方法可以测试某个资源是否在锁定之前已被锁定。

ms177413.note(zh-cn,SQL.90).gif注意:
在 SQL Server 2005 中,可以使用 sys.dm_os_waiting_tasks 动态管理视图确定某个进程是否被阻塞以及被谁阻塞。在早期版本的 SQL Server 中,可以使用 sp_who 系统存储过程。

LOCK_TIMEOUT 设置允许应用程序设置语句等待阻塞资源的最长时间。如果某个语句等待的时间超过 LOCK_TIMEOUT 的设置时间,则被阻塞的语句自动取消,并会有错误消息 1222 (Lock request time-out period exceeded) 返回给应用程序。但是,SQL Server 不会回滚或取消任何包含语句的事务。因此,应用程序必须具有可以捕获错误消息 1222 的错误处理程序。如果应用程序不能捕获错误,则会在不知道事务中已有个别语句被取消的情况下继续运行,由于事务中后面的语句可能依赖于从未执行过的语句,因此会出现错误。

实现捕获错误消息 1222 的错误处理程序后,应用程序可以处理超时情况,并采取补救措施,例如:自动重新提交被阻塞的语句或回滚整个事务。

若要确定当前 LOCK_TIMEOUT 设置,请执行 @@LOCK_TIMEOUT 函数:

SELECT @@lock_timeout;
GO

请参阅

概念

处理应用程序中的错误和消息

其他资源

@@LOCK_TIMEOUT (Transact-SQL)
SET LOCK_TIMEOUT (Transact-SQL)
sp_who (Transact-SQL)
sys.dm_os_waiting_tasks

帮助和信息

获取 SQL Server 2005 帮助