【发布时间】:2012-07-17 23:03:56
【问题描述】:
我正在实现内部没有事务的存储过程。实际上,它会,但仅在特定地点将时间减少到最低限度。存储过程的性质是,我一次只想要一个运行。
我尝试使用 sp_getapplock 但很快发现它需要在事务内部。
是否有其他替代方法可以锁定整个过程但不将其包装到事务中?
【问题讨论】:
标签: sql-server tsql locking sql-server-2008-r2
我正在实现内部没有事务的存储过程。实际上,它会,但仅在特定地点将时间减少到最低限度。存储过程的性质是,我一次只想要一个运行。
我尝试使用 sp_getapplock 但很快发现它需要在事务内部。
是否有其他替代方法可以锁定整个过程但不将其包装到事务中?
【问题讨论】:
标签: sql-server tsql locking sql-server-2008-r2
通过@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';