Несколько запросов на чтение в одной транзакции - PullRequest
0 голосов
/ 18 сентября 2019

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

В консоли # 1 выполните следующее:

set transaction isolation level serializable;
begin transaction;
select * from TableA;
waitfor delay '00:00:15';
select * from TableB;
commit transaction;

В консоли № 2 в течение этого 15-секундного окна, выполните следующее:

set transaction isolation level serializable;
begin transaction;
insert into TableB(col) values('b');
commit transaction;

Через 15 секунд консоль # 1 вернется со строкой с 'b' в ней.Почему?Я думал, консоль № 1 не выдаст результатов, или транзакция № 1 прервется, потому что TableB был изменен.

Я пробовал SQL Server LocalDB 2017 в Windows и SQL Server 2019 RC1 в Linux.Я запускал свои команды sql с DataGrip, но исходный сценарий использования был с Entity Framework 6.

1 Ответ

0 голосов
/ 18 сентября 2019

Выполнение консоли # 1 Возвращает запись 'b' для TableB, потому что консоль # 2 добавляет запись в TableB перед запросом выбора TableB в консоли # 1.Транзакция блокирует только те таблицы, которые существуют в выполнимых запросах.Консоль # 1 не получит запись 'b', если WAIT добавить после выбора TableB.Запрос будет прерван, если структура таблицы будет изменена, например, «Удалить столбец» и добавить новый столбец перед выбором «Запрос», но если * не используется.Ошибка не генерируется, если столбец удаления не существует по имени в выбранном запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...