SqlServer 2005:没有共享记录的死锁问题

对于两个不访问任何常见记录的事务,我遇到了一个死锁问题。 也没有锁升级。 所以我无法解释为什么会出现僵局。

两个此类事务同时执行时发生死锁:

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在三个表格的中间。 如果我在查询中更改了任何内容,例如删除一个连接的表BC ,则不存在死锁。 当我通过A.id而不是A.value筛选时也是A.value

死锁图表告诉我他们都想将S锁设置为表A的主键索引。 再次:没有锁定升级。

我正在使用SqlServer 2005。

  • 为什么这些交易在不访问任何公共数据的情况下发生冲突 任何人都可以解释吗?
  • 我能做些什么来避免它? 我正在使用NHibernate,不能轻松更改查询。
  • 它可能是一个SqlServer的问题?
  • 非常感谢。


    冲突可能发生,因为SQL-Server不仅在行级别锁定,而且在页面甚至表级别锁定。

    这意味着一个记录可以被锁定,即使它本身没有被使用,但只有一个不同的记录“附近”。

    SQL Server锁定争用驯服可能会有所帮助


    另外,当你有时遇到这些问题时,需要考虑的另一件事是锁定可能来自触发器完成的处理。

    链接地址: http://www.djcxy.com/p/32847.html

    上一篇: SqlServer 2005: deadlock problem with no shared records

    下一篇: SQL function not thread safe after UPDLOCK