如果一个SQL Server 2008r2数据库同时接收到一个子表以及父表(通过外键约束相关)的更新语句,那么更新语句是否能够创建死锁情况?在T-SQL中,是否有可能使父表和子表的更新语句死锁?
注释基于评论:在这种情况下更新的字段不是关键字段,它们只是计数器字段。
谢谢。
如果一个SQL Server 2008r2数据库同时接收到一个子表以及父表(通过外键约束相关)的更新语句,那么更新语句是否能够创建死锁情况?在T-SQL中,是否有可能使父表和子表的更新语句死锁?
注释基于评论:在这种情况下更新的字段不是关键字段,它们只是计数器字段。
谢谢。
是的,你可以。这里是证明:
--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;
我测试了这个,并能够产生死锁。
是的,但你正在更新主键... – 2012-03-31 04:54:06
在问题的陈述中没有这样的预设。抛开实用主义,这可能会发生。 – 2012-03-31 05:00:04
确实 - 它不是很常见 – 2012-03-31 05:01:42
编号死锁需要共享依赖关系。 – bnieland 2012-03-31 03:04:53
是的,我相信如果由外键约束引用的值本身由更新修改,则可能是可能的。他们?为了清晰起见,我建议为您的问题场景共享表格模式。 – 2012-03-31 12:33:41
@bnieland我会认为PK FK关系是一个共享依赖关系。 – Paparazzi 2012-03-31 13:31:30