вставить эксклюзивную блокировку - PullRequest
0 голосов
/ 28 мая 2010

Я думал о следующих операторах SQL:

INSERT INTO A(a1, a2)
SELECT b1, udf_SomeFunc(b1)
FROM B

Где udf_SomeFunc делает выбор в таблице A. Как я понимаю, сначала устанавливается общая блокировка на A (сейчас я говорю только о таблице A), затем, после снятия этой блокировки, получается эксклюзивная блокировка для вставить данные. Вопрос заключается в следующем: возможно ли, что другая транзакция получит монопольную блокировку таблицы A непосредственно перед тем, как текущая транзакция получит свой эксклюзивный лок на A?

1 Ответ

1 голос
/ 28 мая 2010

Пища для размышлений

create table test(id int)

insert test values(1)
GO

Теперь в одном окне запустите этот

begin tran


insert into test
select * from test with (holdlock, updlock)
waitfor delay '00:00:30'
commit

пока он работает, откройте другое соединение и сделайте это

begin tran

insert into test
select * from test with (holdlock, updlock)
commit

как вы можете видеть, вторая вставка не произойдет, пока первая транзакция не будет завершена

Теперь уберите подсказки блокировки и наблюдайте разницу

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