Transaction And Lock--使用资源锁来控制并发

写过程序的朋友都知道,在多线程处理时,对于非线程安全的对象,需用使用锁定特定对象(LOCK)的方法来保证串行操作。曾经有位开发询问我,在SQL Server内部是否有类似的实现方法来控制某一操作不能并行,无知的我毫不犹豫地告诉他不可能,还把这当成一个笑话跟陈璟提起,陈桑默默告诉我,这个可以实现!!!

无知者无罪,但不能继续无知下去,所以让我们一起来学习下应用程序资源锁吧

首先我们可以使用sp_getapplock来尝试获取一个程序资源锁

DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'Form1', 
               @LockMode = 'Exclusive',
               @LockOwner ='session'
SELECT @result

然后使用SP_LOCK来查看锁

我们会发现有一个新的X锁,锁定资源为"0:[Form1]:(ae2e65ee)",如果我们开启新会话再次运行

DECLARE @result int;
EXEC @result = sp_getapplock @Resource = 'Form1', 
               @LockMode = 'Exclusive',
               @LockOwner ='session'
SELECT @result

发现该回话被阻塞,再次查看锁情况

会发现新会话等待资源为"0:[Form1]:(ae2e65ee)"上的X锁,直到会话53结束。

由此,我们便可以使用这个功能来实现与程序相似的功能

--========================================================

相关链接

MSDN sp_getapplock

MSDN sp_releaseapplock

使用sp_getapplock來確保某段SQL同時間只能有一個Session執行

--=======================================================

妹子

原文地址:https://www.cnblogs.com/TeyGao/p/3659305.html