Можно ли сохранить блокировки, считываемые с блокировкой обновления, в сериализуемом режиме, но освобождая при подтверждении чтения? - PullRequest
1 голос
/ 07 сентября 2011

Рассмотрим следующие две транзакции

T1

begin tran
set transaction isolation level read committed
select name from foo with (UPDLOCK) where id = 1 --L1
select blah from bar where id = 2 --L2
commit

T2

begin tran
set transaction isolation level serializable
select name from foo with (UPDLOCK) where id = 1 --L3
select blah from bar where id = 2 --L4
commit

Я заметил, что блокировки, полученные L1, будут удерживаться до концатранзакции и не освобождаются, хотя транзакция говорит read committed.Где, как в случае serializable, блокировка удерживается до конца, как и ожидалось.То, что я ищу, - это любой совет, который снимет блокировку обновления в случае подтверждения чтения, но сохранит блокировку в случае сериализации.Возможно ли это?

В итоге, если я запускаю T1 и T2 параллельно, а L1 выполняется первым, L3 придется ждать, пока L1 не закончится.Как только L1 завершен, L3 теперь может выполняться параллельно и не должен ждать окончания L2.

Это для Microsoft SQL Server 2008.

РЕДАКТИРОВАТЬ: Почему?потому что я пытаюсь решить эту проблему Как намекнуть блокировку обновления без дублирования кода хранимой процедуры Так что, если я могу снять блокировки обновления, если область транзакции считывается подтвержденной, она должна работать.

1 Ответ

3 голосов
/ 08 сентября 2011

Я заметил, что замки, полученные L1, будут удерживаться до конец транзакции и не освобождаются, хотя транзакция прочитал совершено.

Это потому, что вы использовали подсказку UPDLOCK. С Таблица Советы :

UPDLOCK Указывает, что блокировки обновления следует снимать и удерживать до транзакция завершена.

На основании вашего описания все звучит так, как будто работает так, как задумано. Не существует «ручных» способов снять снятые блокировки - транзакция должна быть завершена.

Может быть, если бы вы могли объяснить, что вы пытаетесь достичь, решение может быть найдено?

...