Я не могу понять, как будет действовать выбор, пока его часть эксклюзивной транзакции. Пожалуйста, обратите внимание следующие сценарии -эксклюзивная блокировка и общая блокировка для оператора select - SQL Server
Сценарий 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.
Заранее благодарим за помощь в понимании этого поведения.
EDIT: Почему мне нужно выбрать эксклюзивную блокировку?
У меня есть SP, который фактически генерирует последовательные значения. Таким образом, поток -
- чтение максимальных значений из таблицы и сохранять значение переменных
- Обновления таблицы заданного значения = значение +-
Этой ИП выполняется параллельно несколько тысяч экземпляров. Если два экземпляра выполняют SP одновременно, они будут читать одно и то же значение и будут обновлять значение + 1. Хотя я хотел бы иметь последовательное значение для каждого исполнения. Я думаю, что это возможно только в том случае, если select также является частью эксклюзивной блокировки.
Это связано с некоторой оптимизацией, которую делает sql, обратитесь к этой ссылке. Http: //sqlblog.com/blogs/louis_davidson/archive/2006/12/13/does-xlock-always-prevent-reads-by -others.aspx. Если вы хотите, чтобы он правильно работал, используйте 2 вкладки. – Aflred