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

标签 sql-server-2005 deadlock

我有两个不访问任何公共(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/

    相关文章:

    c# - 如何让这个 CLR 与 2005 一起工作?

    sql-server - 存储过程中 varchar 输出参数的用途是什么 - 不能 'return @myvarchar' 但可以 'select @myvarchar'

    sql - 未获取查询中的所有记录

    php - 发送电子邮件的脚本出现死锁

    c++ - 信号/暂停死锁

    sql - 如何根据列的值查找连续的行?

    sql-server - 在 SQL Server 2005 上违反 INSERT WHERE COUNT(*) = 0 上的 UNIQUE KEY 约束

    mysql - InnoDB 死锁,锁定模式 S 和 X

    java - 代码中是否发生了线程饥饿死锁?

    python - 使用 0mq (ZeroMQ) 同步两个简单 python3 脚本时出现死锁