Я не могу понять, как будет вести себя select, пока он является частью эксклюзивной транзакции. Пожалуйста, рассмотрите следующие сценарии –
Сценарий 1 Шаг 1.1
create table Tmp(x int)
insert into Tmp values(1)
Шаг 1.2 – сеанс 1
begin tran
set transaction isolation level serializable
select * from Tmp
Шаг 1.3 – сеанс 2
select * from Tmp
Даже если первая сессия не завершена, сессия 2 сможет прочитать таблицу tmp. Я думал, что у Tmp будет эксклюзивная блокировка, а общая блокировка не должна выдаваться для выбора запроса в сеансе 2. Но этого не происходит. Я убедился, что уровень изоляции по умолчанию READ COMMITED.
Заранее спасибо за помощь в понимании этого поведения.
РЕДАКТИРОВАТЬ: Почему мне нужно выбрать эксклюзивную блокировку?
У меня есть SP, который фактически генерирует последовательные значения. Итак, поток —
- прочитать максимальные значения из таблицы и сохранить значение в переменных
- Обновить заданное значение таблицы = значение + 1
Эта SP выполняется параллельно несколькими тысячами экземпляров. Если два экземпляра выполняют SP одновременно, они будут считывать одно и то же значение и обновлять значение +1. Хотя я хотел бы иметь последовательное значение для каждого выполнения. Я думаю, что это возможно только в том случае, если select также является частью монопольной блокировки.