自定义锁超时

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

注意注意

在 SQL Server 中,可以使用 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