什么时候死锁不是死锁?

Gix*_*ita 6 t-sql

我问这个问题,因为我不时会陷入僵局,我不明白.

这是场景:

更新表A的存储过程:

UPDATE A
SET    A.Column = @SomeValue
WHERE  A.ID     = @ID
Run Code Online (Sandbox Code Playgroud)

插入临时表#temp的存储过程:

INSERT INTO #temp (Column1,Column2)

SELECT B.Column1, A.Column2

FROM B

INNER JOIN A
  ON A.ID = B.ID

WHERE  B.Code IN ('Something','SomethingElse')
Run Code Online (Sandbox Code Playgroud)

我看到可能存在锁等待,但我看不出会发生什么样的死锁,我是否遗漏了一些明显的东西?

编辑:

我在这里输入的SP显然是简化版本,但我使用的是相关列.两个表的结构如下:

CREATE TABLE A (ID IDENTITY
                   CONSTRAINT PRIMARY KEY,
                Column VARCHAR (100))


CREATE TABLE B (ID IDENTITY
                   CONSTRAINT PRIMARY KEY,
                Code VARCHAR (100))
Run Code Online (Sandbox Code Playgroud)

Pas*_*als 1

请尝试此操作,因为它的引发锁为表名称指定了表提示和关键字:

WITH(NOLOCK)
Run Code Online (Sandbox Code Playgroud)

所以对于你的场景来说是这样的:

    INSERT INTO #temp (Column1,Column2)

    SELECT B.Column1, A.Column2

FROM B WITH(NOLCOK)

INNER JOIN A WITH(NOLOCK)
  ON A.ID = B.ID

WHERE  B.Code IN ('Something','SomethingElse')
Run Code Online (Sandbox Code Playgroud)

到时候看你怎么走。

您还可以查找 tsql、sql server 的表提示,看看哪一个最适合您。我指定的 NOLCOK 不会导致锁定,而且它还会跳过锁定的行,因为其他进程正在使用它们,因此如果您不在乎,可以使用它。

我不确定临时表,但您也可以通过 INSERT、INSERT INTO WITH(TABLE_HINT) 使用表提示。