将TABLOCK与合并SQL Server一起使用

时间:2018-10-18 14:50:57

标签: sql sql-server merge deadlock

我有一个与以下查询类似的合并查询:

        {{ post.message }}
        {% if user.is_staff %}
          <div class="mt-3">
            <a href="{% url 'edit_post' post.topic.board.pk post.topic.pk post.pk %}"
               class="btn btn-primary btn-sm"
               role="button">Edit</a>
          </div>
        {% endif %}

如果我要添加TABLOCK,哪里是最好的地方?我以为我会像下面这样说-包装整个merge语句:

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)

或者更适合插入语句吗?

1 个答案:

答案 0 :(得分:0)

您应该问自己的第一个问题是,为什么根本需要此表提示? 合并是在隐式事务中运行的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

这实际上取决于您要锁定未发货或订购的表。