【问题标题】:sp_getapplock without transaction没有事务的 sp_getapplock
【发布时间】:2012-07-17 23:03:56
【问题描述】:

我正在实现内部没有事务的存储过程。实际上,它会,但仅在特定地点将时间减少到最低限度。存储过程的性质是,我一次只想要一个运行。

我尝试使用 sp_getapplock 但很快发现它需要在事务内部。

是否有其他替代方法可以锁定整个过程但不将其包装到事务中?

【问题讨论】:

    标签: sql-server tsql locking sql-server-2008-r2


    【解决方案1】:

    通过@LockOwner 传入 Session 以获得 Session 范围锁;获取锁时,这不需要事务处于活动状态。

    例如

    EXEC @res = sp_getapplock @Resource = 'Lock ID', @LockOwner = 'Session', @LockMode = 'Exclusive';
    ..
    code
    ..
    
    EXEC @res = sp_releaseapplock @Resource = 'Lock ID';
    

    【讨论】:

    • 不明白你的意思,你能发个例子吗?
    • 是的,成功了!将@LockOwner = 'Session'也添加到sp_releaseapplock,否则会抛出错误
    • 我相信你发布时也必须提供@LockOwner?至少我做到了,否则我得到错误“语句或函数必须在用户事务的上下文中执行。”。即使用EXEC @res = sp_releaseapplock @Resource = 'Lock ID', @LockOwner = 'Session';
    • 另请注意,结束会话会释放会话锁。来自msdn.microsoft.com/en-us/library/ms189823(SQL.90).aspx,“与会话关联的锁在会话注销时被释放。”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多