sp_getAppLock  获取程序资源锁,简单的说就是调用此函数可以达到我们程序中.NET的lock锁的作用.

作用域是当前数据库下
四个参数:
@resource(必填):资源名称,类型nvarchar(255),必填,不区分大小写,如果超出255,则取前255个字符,作用域是当前数据库下. 
@lockMode(必填):锁的模式,类型nvarchar(32),必填,五个值供选择:
Shared: 共享, 相当于锁里面的S,
Update: 更新, 相当于锁里面的U
IntentShared: 意向共享, 相当于锁里面的IS
IntentExclusive: 意向更新, 相当于锁里面的IX
Exclusive: 独占, 相当于锁里面的X, 其中我们经常使用的是Exclusive,表示独占上面这个@resource资源
@lockOwner:锁的拥有者,2个值供参考:
1. Transaction:默认值,如果使用这个,则必须显示声明事务,事务结束以后释放锁
2. Session:会话, 会话结束以后释放锁
@lockTimeout:锁的超时时间 (毫秒)。 默认值与 @@LOCK_TIMEOUT返回的值相同。 若要指示锁请求应返回的返回代码为-1,而不是在不能立即授予请求时等待锁,请指定0。
@DBPrincipal:数据库角色

我们一般都是使用@LockMode=Exclusive,@LoackMode=Transaction这种方式,所以下面是这种方式的测试.

DECLARE @RC INT 

Begin tran 

Exec @RC =sp_getapplock @Resource='MyLock', @LockMode='Exclusive' , @LockOwner='Transaction', @LockTimeout = 15000 

SELECT @@SPID [session_id], @RC [return code], GETDATE() 

waitfor delay '00:00:08' 

commit

回傳值的說明(MSDN)

>= 0 (成功) 或 < 0 (失敗)

0:同步授與鎖定成功。
1:在等待其他不相容的鎖定釋出之後,授與鎖定成功。
-1:鎖定要求逾時。
-2:已取消鎖定要求。
-3:已將鎖定要求選為死結犧牲者。
-999:表示參數驗證或其他呼叫錯誤。

欢迎转载,请注明来自白菜卖故事>>本文地址:http://www.bcmgs.com/775

0 还没人赞过...