Учебно-практическое пособие москва 2017 ббк


BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE



Pdf көрінісі
бет203/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   199   200   201   202   203   204   205   206   ...   243
Байланысты:
Язык SQL. Базовый курс

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN
UPDATE modes
SET mode = 'LOW'
WHERE mode = 'HIGH'
RETURNING *;
Изменение, произведенное в первой транзакции, вторая транзакция не видит, по-
скольку на уровне изоляции SERIALIZABLE каждая транзакция работает с тем сним-
ком базы данных, которых был сделан в ее начале, т. е. непосредственно перед выпол-
нением ее первого оператора. Поэтому обновляется только одна строка, та, в которой
значение поля mode было равно «HIGH» изначально.
num | mode
-----+------
2 | LOW
(1 строка)
UPDATE 1
Обратите внимание, что обе команды UPDATE были выполнены, ни одна из них не
ожидает завершения другой транзакции.
Посмотрим, что получилось в первой транзакции:
SELECT * FROM modes;
num | mode
-----+------
2 | HIGH
1 | HIGH
(2 строки)
211


А во второй транзакции:
SELECT * FROM modes;
num | mode
-----+------
1 | LOW
2 | LOW
(2 строки)
Заканчиваем эксперимент. Сначала завершим транзакцию на первом терминале:
COMMIT;
COMMIT
А потом на втором терминале:
COMMIT;
ОШИБКА: не удалось сериализовать доступ из-за зависимостей чтения/записи
между транзакциями
,

ПОДРОБНОСТИ: Reason code: Canceled on identification as a pivot, during
commit attempt.
,

ПОДСКАЗКА: Транзакция может завершиться успешно при следующей попытке.
Какое же изменение будет зафиксировано? То, которое сделала транзакция, первой
выполнившая фиксацию изменений.
SELECT * FROM modes;
num | mode
-----+------
2 | HIGH
1 | HIGH
(2 строки)
Таким образом, параллельное выполнение двух транзакций сериализовать не уда-
лось. Почему? Если обратиться к определению концепции сериализации, то нужно
рассуждать так. Если бы была зафиксирована и вторая транзакция, тогда в таблице
modes содержались бы такие строки:
num | mode
-----+------
1 | HIGH
2 | LOW
Но этот результат не соответствует результату выполнения транзакций
ни при одном
из двух возможных вариантов их упорядочения, если бы они выполнялись последо-
вательно. Следовательно, с точки зрения концепции сериализации, эти транзакции
невозможно сериализовать. Покажем это, выполнив транзакции последовательно.
Предварительно необходимо пересоздать таблицу modes или с помощью команды
UPDATE вернуть ее измененным строкам исходное состояние.
Теперь обе транзакции можно выполнять на одном терминале. Первый вариант их
упорядочения такой:
212




Достарыңызбен бөлісу:
1   ...   199   200   201   202   203   204   205   206   ...   243




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет