sp_getapplock @lockResult Return 代码位置
sp_getapplock @lockResult Return Code position
以下存储的(名为 "sp_getNextObj")程序预制 select、update 和 插入
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的body之后还是之前,意思是:@LockResult什么时候取值?
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
以下存储的(名为 "sp_getNextObj")程序预制 select、update 和 插入
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的body之后还是之前,意思是:@LockResult什么时候取值?
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