gpt4 book ai didi

sql-server-2005 - Sql Server 2005 : deadlock problem with no shared records

转载 作者:行者123 更新时间:2023-12-04 17:59:30 24 4
gpt4 key购买 nike

我有两个不访问任何公共(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 的中间。如果我更改查询中的任何内容,例如删除其中一个联接表 BC ,没有死锁。当我按 A.id 过滤时也是如此而不是 A.value .

死锁图告诉我,他们都想为表 A 的主键索引设置一个 S 锁。 .同样:没有锁升级。

我正在使用 SqlServer 2005。
  • 为什么这些事务在不访问任何公共(public)数据的情况下会发生冲突?谁能解释一下?
  • 我能做些什么来避免它?我正在使用 NHibernate,无法轻易更改查询。
  • 会不会是 SqlServer 问题?

  • 非常感谢。

    最佳答案

    可能会发生冲突,因为 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com