SQL Server 2000 自定义锁超时

本文介绍在Microsoft SQL Server中如何通过设置LOCK_TIMEOUT来控制事务等待锁的时间,避免无限期阻塞。当达到超时时间后,系统将取消阻塞的语句并返回错误信息。文章还解释了如何使用sp_who系统存储过程来确定进程是否被阻塞及如何通过错误处理程序应对超时情况。

当由于另一个事务已拥有一个资源的冲突锁,而导致 Microsoft® SQL Server™ 2000 无法将锁
授权给该资源的某个事务时,该事务被阻塞以等待该资源的操作完成。如果这导致了死锁,则
 SQL Server 将终止其中参与的一个事务(不涉及超时)。如果没有出现死锁,则在其它事务
释放锁之前,请求锁的事务被阻塞。默认情况下,没有强制的超时期限,并且除了试图访问
数据外(有可能被无限期阻塞),没有其它方法可以测试某个资源是否在锁定之前已被锁定。

说明  sp_who 系统存储过程可用于确定进程是否正被阻塞以及被谁阻塞。

LOCK_TIMEOUT 设置允许应用程序设置语句等待阻塞资源的最长时间。当语句等待的时间大于
 LOCK_TIMEOUT 设置时,系统将自动取消阻塞的语句,并给应用程序返回"已超过了锁请求超
时时段"的 1222 号错误信息。

但是,SQL Server 不回滚或取消任何包含该语句的事务。因此,应用程序必须有捕获 1222 号
错误信息的错误处理程序。如果应用程序没有捕获错误,则会继续运行,并未意识到事务中
的个别语句已取消,从而当事务中的后续语句可能依赖于那条从未执行的语句时,导致应用程序出错。
执行捕获错误信息 1222 的错误处理程序使应用程序得以处理发生超时的情况,并采取补救操作,
例如可以自动重新提交阻塞的语句或者回滚整个事务。

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

SET LOCK_TIMEOUT

指定语句等待锁释放的毫秒数。

语法

SET LOCK_TIMEOUT timeout_period

参数

timeout_period

是在 Microsoft® SQL Server™ 返回锁定错误前经过的毫秒数。值为 -1(默认值)

时表示没有超时期限(即无限期等待)。

当锁等待超过超时值时,将返回错误。值为 0 时表示根本不等待,并且一遇到锁就返回信息。

注释

在连接开始时,该设置的值为 -1。设置更改后,新设置在其余的连接时间里一直有效。

SET LOCK_TIMEOUT 的设置是在执行或运行时设置,而不是在分析时设置。

READPAST 锁定提示为该 SET 选项提供了另一种方式。

权限

SET LOCK_TIMEOUT 权限默认授予所有用户。

示例

下例将锁超时期限设置为 1,800 毫秒。






-----------------------------------------------------------------------------------------

转载于:https://www.cnblogs.com/stillman/archive/2006/01/14/317185.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值