我问这个问题,因为我不时会陷入僵局,我不理解。
这是情景:
更新表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))
答案 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)的表提示。