【问题标题】:Using TABLOCK with merge SQL Server将 TABLOCK 与合并 SQL Server 一起使用
【发布时间】:2019-03-23 10:13:11
【问题描述】:

我有一个类似于下面的合并查询:

MERGE [Unshipped] u
USING [Order] or ON or.ID = u.ID

WHEN MATCHED AND u.Date <> or.Date
   THEN
      UPDATE 
      SET u.Date = or.Date

WHEN NOT MATCHED
    THEN 
       INSERT (ID, FK, Date)
       VALUES (or.ID, or.FK, or.Date)

如果我要添加 TABLOCK,它的最佳位置在哪里?我会假设我会像下面这样 - 包装整个合并语句:

     MERGE [Unshipped] u WITH (TABLOCK)
     USING [Order] order or ON or.ID = u.ID

或者它更适合与插入语句一起使用?

【问题讨论】:

  • 您想通过使用 tabblock 解决什么问题?你也应该阅读这篇关于合并问题的文章:mssqltips.com/sqlservertip/3074/… 尽管它很方便,但还是有一些陷阱。我使用了 WITH (SERIALIZABLE) 或者只是用 INSERT/UPDATE 组合替换它
  • @user1443098 死锁
  • MS 出现了一个问题,该问题被关闭为“按设计”

标签: sql sql-server merge deadlock


【解决方案1】:

您应该问自己的第一个问题是,为什么您需要这个表格提示? Merge 是在隐式事务中运行的 DML 语句。 这样,您将阻止整个表格,但如果您愿意,您应该将提示放在您需要锁定的表格上。 看看文档:https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-2017

MERGE [Unshipped] u WITH (TABLOCK)

USING [Order] order as or WITH (TABLOCK) ON or.ID = u.ID

这真的取决于您要锁定哪个表 Unshipped 或 Order。

【讨论】:

  • 不幸的是,MERGE 并不是真正的、完全原子的
  • 这真的取决于 SQL Server 的版本以及我们在这里讨论的问题(Merge 真的有问题):)
  • 没错,这就是我回避它的原因。
猜你喜欢
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2015-12-22
  • 2015-11-26
  • 2011-09-02
  • 1970-01-01
相关资源
最近更新 更多