什么时候死锁不是死锁?

时间:2012-01-09 16:39:38

标签: tsql

我问这个问题,因为我不时会陷入僵局,我不理解。

这是情景:

更新表A的存储过程:

UPDATE A
SET    A.Column = @SomeValue
WHERE  A.ID     = @ID

插入临时表的存储过程#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')

我看到可能存在锁定等待,但我没有看到如何发生死锁,我是否遗漏了一些明显的东西?

修改

我在这里输入的SP显然是简化版本,但我正在使用所涉及的列。两个表的结构如下:

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


CREATE TABLE B (ID IDENTITY
                   CONSTRAINT PRIMARY KEY,
                Code VARCHAR (100))

1 个答案:

答案 0 :(得分:1)

尝试这个,因为它的导致锁定为表名提供了表提示和关键字:

WITH(NOLOCK)

对于你的场景,有些事情是这样的:

    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')

看看你如何去。

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

我不确定临时表,但你也可以使用INSERT,INSERT INTO WITH(TABLE_HINT)的表提示。