2012-03-31 24 views
3

如果一个SQL Server 2008r2数据库同时接收到一个子表以及父表(通过外键约束相关)的更新语句,那么更新语句是否能够创建死锁情况?在T-SQL中,是否有可能使父表和子表的更新语句死锁?

注释基于评论:在这种情况下更新的字段不是关键字段,它们只是计数器字段。

谢谢。

+0

编号死锁需要共享依赖关系。 – bnieland 2012-03-31 03:04:53

+0

是的,我相信如果由外键约束引用的值本身由更新修改,则可能是可能的。他们?为了清晰起见,我建议为您的问题场景共享表格模式。 – 2012-03-31 12:33:41

+1

@bnieland我会认为PK FK关系是一个共享依赖关系。 – Paparazzi 2012-03-31 13:31:30

回答

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; 

我测试了这个,并能够产生死锁。

+0

是的,但你正在更新主键... – 2012-03-31 04:54:06

+0

在问题的陈述中没有这样的预设。抛开实用主义,这可能会发生。 – 2012-03-31 05:00:04

+0

确实 - 它不是很常见 – 2012-03-31 05:01:42

相关问题