我有两个不访问任何公共(public)记录的事务的死锁问题。也没有锁升级。所以我无法解释为什么会出现死锁。
当两个这样的事务同时执行时,就会发生死锁:
begin transaction
update A set [value] = [value]
where id = 1; /* resp. 2 */
/* synchronize transactions here */
SELECT *
FROM
A inner join B on A.B_FK = B.id
inner join C on C.A_FK = A.id
WHERE
A.[value] = 1; /* resp. 2 */
rollback;
这些是设置场景的表格和数据:
CREATE TABLE A (
id INT NOT NULL,
[value] INT,
B_FK INT
primary key (id)
)
CREATE TABLE B (
id INT NOT NULL,
primary key (id)
)
CREATE TABLE C (
id INT NOT NULL,
A_FK INT
primary key (id)
)
INSERT INTO A VALUES(1, 1, 1)
INSERT INTO B VALUES(1)
INSERT INTO C VALUES(1, 1)
INSERT INTO A VALUES(2, 2, 2)
INSERT INTO B VALUES(2)
INSERT INTO C VALUES(2, 2)
表
A
在三张 table 的中间。如果我更改查询中的任何内容,例如删除其中一个联接表 B
或 C
,没有死锁。当我按 A.id
过滤时也是如此而不是 A.value
.死锁图告诉我,他们都想为表
A
的主键索引设置一个 S 锁。 .同样:没有锁升级。我正在使用 SqlServer 2005。
非常感谢。
最佳答案
可能会发生冲突,因为 SQL-Server 不仅在行级别进行锁定,而且在页面甚至表级别进行锁定。
这意味着可以锁定一条记录,即使它本身实际上并未在使用,而只是“附近”的另一条记录。
SQL Server Lock Contention Tamed可能会有所帮助
关于sql-server-2005 - Sql Server 2005 : deadlock problem with no shared records,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1437200/