Я прочитал статью (https://www.simple-talk.com/sql/t-sql-programming/questions-about-t-sql-transaction-isolation-levels-you-were-too-shy-to-ask/), и у меня есть вопрос в соответствии с:
«SERIALIZABLE: запрос в текущей транзакции не может считать данные, измененные другой транзакцией, которая еще не зафиксирована. Никакая другая транзакция не может изменять данные, считываемые текущей транзакцией, до ее завершения, и никакая другая транзакция не может вставлять новые строки, которые соответствовали бы условия поиска в текущей транзакции до ее завершения. В результате уровень изоляции Serializable предотвращает грязные чтения, неповторяемые чтения и фантомные чтения. Однако он может оказать наибольшее влияние на производительность по сравнению с другими уровнями изоляции».
Меня смущает вставка новых строк, которые не соответствуют условию поиска из 1 сеанса/запроса. Пример ниже:
Предположим, у меня есть таблица
EmpID FirstName
1 john
2 new employee
3 A new employee
И запросы в отдельных вкладках:
--session 1----------------------------------
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT FirstName FROM EmployeeInfo
WHERE FirstName like 'new empl%'
WAITFOR DELAY '00:00:10'
SELECT FirstName FROM EmployeeInfo
WHERE FirstName like 'new empl%'
ROLLBACK TRANSACTION;
---------session 2---------------------------
begin transaction;
UPDATE EmployeeInfo
SET FirstName = 'frank'
WHERE EmpID = 1;
commit transaction;
-----session 3----
insert into EmployeeInfo values('A new employe 2')
Я выполняю запросы один за другим: сеанс 1, сеанс 2, сеанс 3. Я ожидал, что сеанс 1 не остановит выполнение сеанса 2 и сеанса 3, потому что обновления и вставки из этого сеанса не выполняют условие поиска, которое используется в первом запросе. Однако в результатах я вижу, что сеанс 1 должен быть завершен (откат) до выполнения сеанса 2 и сеанса 3.
Однако, пока я использую другое условие поиска в сеансе 1, как показано ниже:
--session 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT EmpID, FirstName FROM EmployeeInfo
WHERE EmpID = 2
WAITFOR DELAY '00:00:10'
SELECT FirstName FROM EmployeeInfo
ROLLBACK TRANSACTION;
затем сеанс 2 и сеанс 3 завершаются независимо от сеанса 1. Почему? Почему нравится вставка блока условий, а "=" нет?
Отредактировано: 1. На EmpID есть только первичный ключ.