抱歉 - 我不确定之前是否已经解决了这个问题(我找不到任何相关内容 - 请指导我)
我不是一个SQL人,但是试图管理SQL数据库&修复正在进行的问题,直到新的SQL开发人员出现。所以请原谅我的愚蠢问题。
我们有一个存储过程,它执行以下操作..
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRAN
EXEC sp_getapplock @Resource=DBLock_100, @LockMode='Exclusive', @LockOwner='Transaction', @DbPrincipal = N'dbo';
-- SELECTS, UPDATES, DELETES, INSERTS ETC... on a few tables (nothing fancy, simple queries)
COMMIT TRAN
我的问题......
我只是想了解applock&交易在这里做。因为很多客户端正在经历缓慢,特别是当上述SP正在执行时。 SP确实需要很长时间才能执行(一旦新人出现,我们最终会调整它)
提前致谢, 约瑟夫。
答案 0 :(得分:2)
我是否正确理解sp_getapplock将创建一个锁 名字DBLock_100?
它在标记为“DBLock_100”的资源上创建应用程序锁定。没有其他的。代码唯一阻止的是获取相同应用程序锁的其他尝试。
即。对sp_getapplock @Resource=DBLock_100
的并发调用。因此它将序列化对该存储过程的访问。任何并发执行尝试都需要等待。
是否在整个数据库上创建锁定?或者只有表格 它将在下面的代码中访问?
都不是。取出的唯一锁定在名为“DBLock_100”
的自定义锁资源上其他SP,查询等...仍然可以访问正在使用的表 通过上面的SP?有没有NOLOCK?
是。只要他们不首先尝试获取名为“DBLock_100”的应用程序锁。虽然您未向我们展示的更新,删除,插入等仍会获得可能阻止它们的锁定。
我们COMMIT TRAN后会自动释放上述锁吗?
是。当您致电sp_releaseapplock
或其拥有的交易结束时,锁定将被释放。
所有其他SP查询将一直保持到上述SP提交为止 还是回滚?
没有。见上文