Учебное пособие Санкт-Петербург «бхв-петербург»


COMMIT; COMMIT А потом на втором терминале: COMMIT



Pdf көрінісі
бет209/256
Дата18.11.2022
өлшемі1.88 Mb.
#465124
түріУчебное пособие
1   ...   205   206   207   208   209   210   211   212   ...   256
sql osnovi yazika

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
Но этот результат не соответствует результату выполнения транзакций ни при одном
из двух возможных вариантов их упорядочения, если бы они выполнялись последо-
вательно. Следовательно, с точки зрения концепции сериализации эти транзакции
невозможно сериализовать.
Покажем это, выполнив транзакции последовательно.
272


9.5. Уровень изоляции Serializable
Предварительно необходимо пересоздать таблицу modes или с помощью команды
UPDATE вернуть ее измененным строкам исходное состояние. Теперь обе транзакции
можно выполнять на одном терминале. Первый вариант их упорядочения такой:
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN
UPDATE modes
SET mode = 'HIGH'
WHERE mode = 'LOW'
RETURNING *;
num | mode
-----+------
1 | HIGH
(1 строка)
UPDATE 1
END;
COMMIT
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN


Достарыңызбен бөлісу:
1   ...   205   206   207   208   209   210   211   212   ...   256




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

    Басты бет