以下存储(名为“sp_getNextObj”)过程预先形成选择,更新和插入
DECLARE @LockResults int
BEGIN TRAN
EXEC @LockResults = sp_getapplock
@Resource = 'sp_getNextObj',
@LockMode = 'Exclusive',
@LockOwner = 'transaction',
@LockTimeout = '3000'
IF @LockResults<0
BEGIN
ROLLBACK
RETURN
END
UPDATE ...
INSERT INTO ...
SELECT * FROM ...
-- release the SP lock
EXEC sp_releaseapplock @Resource = 'sp_getNextObj'
COMMIT
END
我使用 sp_getapplock 设置锁定区域中的代码,
问题是:
是需要在sp之后还是之前的条件,意味着:当@LockResult得到它的值时?
答案 0 :(得分:0)
sp_getapplock将序列化对存储过程中代码块内的关键部分的访问。它可以位于存储过程的主体内,保护您要序列化访问的部分。
如果sp_getapplock
调用与后续COMMIT
或ROLLBACK
之间的代码调用名为X的存储过程,那么该存储过程将仅在调用者的上下文中受到保护锁。其他命令可以使用锁定在代码上下文之外调用X.
PROCEDURE Y
BEGIN
DO SOME STUFF
...
LOCK HERE --> Critical Section
...
CALL X
COMMIT OR ROLLBACK HERE --> Release Lock
...
DO SOME STUFF
END