Sql 事务中的sp_getapplock事务

Sql 事务中的sp_getapplock事务,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,关于sp_getapplock,我有一个很快的问题。 是否允许使用相同的资源(锁id)从一个存储过程调用sp_getapplock到另一个存储过程 例如: CREATE PROCEDURE [uspTest1] ( ... ... ) AS BEGIN TRY BEGIN TRANSACTION ... ... EXEC @RC = sp_getapplock @Resource = "Test 123",

关于sp_getapplock,我有一个很快的问题。 是否允许使用相同的资源(锁id)从一个存储过程调用sp_getapplock到另一个存储过程

例如:

CREATE PROCEDURE [uspTest1]
(
    ...
    ...
)
AS
BEGIN TRY
    BEGIN TRANSACTION
        ...
        ...
        EXEC @RC = sp_getapplock @Resource = "Test 123",
                                 @LockMode = 'Exclusive',
                                 @LockOwner = 'Transaction',
                                 @LockTimeout = 60000,
                                 @DbPrincipal = 'public';
        IF @RC NOT IN (0, 1) THROW 50000, 'Unable to obtain lock', 1;
        ...
        ...
        EXEC [uspTest2] ..., ..., ...
    COMMIT
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
    THROW
END CATCH


-- Test 2
CREATE PROCEDURE [uspTest2]
(
    ...
    ...
)
AS
BEGIN TRY
    BEGIN TRANSACTION
        EXEC @RC = sp_getapplock @Resource = "Test 123",
                                 @LockMode = 'Exclusive',
                                 @LockOwner = 'Transaction',
                                 @LockTimeout = 60000,
                                 @DbPrincipal = 'public';
        IF @RC NOT IN (0, 1) THROW 50000, 'Unable to obtain lock', 1;
        ...
        ...
        ...
    COMMIT
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
    THROW
END CATCH

由于@Resource(lock id)是相同的,它会失败吗?

我希望从
uspTest2
中调用返回0,即“锁已同步成功授予”,因为此事务中已持有此锁

我认为您仍处于同一事务中,可以在同一事务中多次调用
sp_getapplock

你应该试试看

但是,如果您如图所示使用嵌套事务,则可能会遇到其他问题。例如,如果出于任何原因从
uspTest2
调用
ROLLBACK
,它将回滚所有嵌套事务,所有事务都将回滚到
uspTest1
中调用
BEGIN TRANSACTION
时。你真的想要吗


<> >而不是使用嵌套的<代码>开始事务<代码> <代码> UpStest2考虑使用,然后<代码>回滚SavePositNoNo.<代码> .p> >是的,你可以多次调用它,但是如果你调用它两次,你必须释放它两次。如果第二次调用强于第一次调用,则结果将是两个调用的并集

来源

如果对同一锁资源多次调用sp_getapplock, 但在任何请求中指定的锁定模式都不是 与现有模式相同,对资源的影响是 两种锁定模式。在大多数情况下,这意味着锁定模式为 升级到锁定模式、现有模式或 新请求的模式。此更强的锁定模式将一直保持到锁定 即使以前发生过锁释放调用,最终也会释放 那次。例如,在以下调用序列中 资源以独占模式而不是共享模式保存

来源

备注

当应用程序多次调用sp_getapplock以获取相同的 锁资源,sp_releaseapplock必须调用相同数量的 释放锁的时间


谢谢弗拉基米尔!是的,如果有任何问题,我想回滚所有事务。不过,我在回答中指出,Vladimir并没有说明多个锁需要多个释放。记住这一点。嗨,瑞秋,我用的是@LockOwner='Transaction'。我需要手动释放锁吗?我认为提交或回滚就可以了?@RachelAmbler,您引用的文档页面上说“当事务提交或回滚时,与当前事务相关的锁会被释放。”如果需要在事务完成之前释放锁,您可以使用
sp_releaseapplock
显式释放锁,但你不必这么做。是的,如果你想明确地释放它,你需要调用
sp\u releaseapplock
与调用
sp\u getapplock
的次数相同。如果这是你设计代码的方式,那么你就会受到伤害。任何一个优秀的开发人员都知道要始终跟踪他们创建的内容和发布的内容。你认为它应该工作的那一刻,因为你认为它们都是在一个事务中创建的,那一刻,你在周日早上3:30起床,试图弄清楚为什么你的应用程序表现不好,结果却发现事务中的锁现在在外面,而且现在还没有被释放。