我问这个问题,因为我不时会陷入僵局,我不明白.
这是场景:
更新表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)
请尝试此操作,因为它的引发锁为表名称指定了表提示和关键字:
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) 使用表提示。
| 归档时间: |
|
| 查看次数: |
229 次 |
| 最近记录: |