【问题标题】:SQL 2008 sp_getapplock transaction slownessSQL 2008 sp_getapplock 事务缓慢
【发布时间】:2014-01-28 13:59:26
【问题描述】:

抱歉 - 我不确定这是否已经解决(我找不到任何相关信息 - 请指导我)

我不是 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

我的问题...

  1. 我是否理解 sp_getapplock 将创建一个名为 DBLock_100 的锁?
  2. 是否在整个数据库上创建了锁?还是仅在下面的代码中将访问的表?
  3. 其他 SP、查询等...是否仍能访问上述 SP 正在使用的表?有没有 NOLOCK?
  4. 一旦我们COMMIT TRAN,上面的锁会自动释放吗?
  5. 所有其他 SP,查询将暂停,直到上述 SP 提交或回滚?

我只是想了解 applock 和事务在这里做什么。因为很多客户端都遇到了缓慢的问题,尤其是在执行上述 SP 时,并且 SP 确实需要很长时间才能执行(一旦新人出现,我们最终会进行调整)

提前致谢, 约瑟夫。

【问题讨论】:

    标签: sql sql-server performance transactions locking


    【解决方案1】:

    我是否理解 sp_getapplock 将创建一个锁 一个名字 DBLock_100?

    它在标记为“DBLock_100”的资源上创建一个应用程序锁。没有其他的。代码唯一会阻止的是其他获取相同应用程序锁的尝试。

    即并发呼叫sp_getapplock @Resource=DBLock_100。所以它将序列化对该存储过程的访问。任何并发执行尝试都需要等待。

    它是在整个数据库上创建一个锁吗?或者只有那些表 它会在下面的代码中访问吗?

    两者都没有。唯一取出的锁在名为“DBLock_100”的自定义锁资源上

    其他 SP、查询等是否仍然可以访问正在使用的表 通过上述SP?有没有 NOLOCK?

    是的。只要他们不首先尝试获取名为“DBLock_100”的应用程序锁。尽管您未向我们展示的 UPDATES、DELETES、INSERTS ETC 仍会获取可能会阻塞它们的锁。

    一旦我们COMMIT TRAN,上面的锁会自动释放吗?

    是的。当您调用sp_releaseapplock 或它所属的事务结束时,锁将被释放。

    所有其他 SP,查询将暂停,直到上述 SP 提交 还是回滚?

    没有。见上文

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      相关资源
      最近更新 更多