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


BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ



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

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN
UPDATE aircrafts_tmp
SET range = range + 100
WHERE aircraft_code = '320';
UPDATE 1
На втором терминале попытаемся обновить ту же строку:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN
UPDATE aircrafts_tmp
SET range = range + 200
WHERE aircraft_code = '320';
Команда UPDATE на втором терминале ожидает завершения первой транзакции.
Перейдя на первый терминал, завершим первую транзакцию:
END;
COMMIT
Перейдя на второй терминал, увидим сообщение об ошибке:
ОШИБКА: не удалось сериализовать доступ из-за параллельного изменения
Поскольку обновление, произведенное в первой транзакции, не было зафиксировано
на момент начала выполнения первого (и, в данном частном случае, единственного)
запроса во второй транзакции, то возникает эта ошибка. Это объясняется вот чем.
При выполнении обновления строки команда UPDATE во второй транзакции видит,
что строка уже изменена. На уровне изоляции REPEATABLE READ снимок данных со-
здается на момент начала выполнения первого запроса транзакции и в течение тран-
закции уже не меняется, т. е. новая версия строки не считывается, как это делалось на
уровне READ COMMITTED. Но если выполнить обновление во второй транзакции без
повторного считывания строки из таблицы, тогда будет иметь место потерянное об-
новление, что недопустимо. В результате генерируется ошибка, и вторая транзакция
откатывается. Мы вводим команду END на втором терминале, но PostgreSQL выпол-
няет не фиксацию (COMMIT), а откат:
209


END;
ROLLBACK
Если выполним запрос, то увидим, что было проведено только изменение в первой
транзакции:
SELECT * FROM aircrafts_tmp WHERE aircraft_code = '320';
aircraft_code |
model
| range
---------------+-----------------+-------
320
| Airbus A320-200 | 5900
(1 строка)


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




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

    Басты бет