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