寫過程序的朋友都知道,在多線程處理時,對于非線程安全的對象,需用使用鎖定特定對象(LOCK)的方法來保證串行操作。曾經有位開發詢問我,在SQL Server內部是否有類似的實現方法來控制某一操作不能并行,無知的我毫不猶豫地告訴他不可能,還把這當成一個笑話跟陳璟提起,陳桑默默告訴我,這個可以實現?。。?/p>
無知者無罪,但不能繼續無知下去,所以讓我們一起來學習下應用程序資源鎖吧
首先我們可以使用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執行
--=======================================================
妹子
新聞熱點
疑難解答