Возможно ли в T-SQL операторы обновления для родительской таблицы и дочерней таблицы для взаимоблокировки? - PullRequest
3 голосов
/ 31 марта 2012

Если база данных SQL Server 2008r2 получала операторы обновления как для дочерней таблицы, так и для родительской таблицы (связанной ограничением внешнего ключа), смогут ли операторы обновления создавать ситуацию взаимоблокировки?

Примечание, основанное на комментариях: поля, которые обновляются в этой ситуации, не являются ключевыми полями, это просто поля счетчиков.

Спасибо.

1 Ответ

6 голосов
/ 31 марта 2012

Да, вы можете. Вот доказательство:

--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;

Я проверил это и смог создать тупик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...