在T-SQL中,父表和子表的更新语句是否可能死锁?

时间:2012-03-31 02:59:16

标签: sql-server sql-server-2008 tsql

如果SQL Server 2008r2数据库同时向子表和父表(通过外键约束关联)接收更新语句,更新语句是否能够创建死锁情况?

根据评论注意:在这种情况下更新的字段不是关键字段,它们只是计数字段。

感谢。

1 个答案:

答案 0 :(得分:6)

是的,你可以。这是证据:

--setup
use tempdb;
create table Parent (
    ParentID int not null, 
    constraint PK_Parent primary key clustered (ParentId)
);
insert into Parent values (1), (2), (3);
create table Child (
    ChildId int identity, 
    constraint PK_Child primary key clustered (ChildId),
    ParentId int, 
    constraint FK_Child_Parent foreign key (ParentId) 
        references Parent (ParentId)
);
insert into Child (ParentId) values (2), (2), (3);

--in window 1
use tempdb;
begin tran;
update Child set ParentId = 1 where ParentId = 3;


--in window 2
use tempdb;
begin tran;
update Parent set ParentId = 4 where ParentId = 1;

--back in window 1
update Child set ParentId = 4 where ParentId = 2;

我对此进行了测试,并且能够产生死锁。