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


END; COMMIT А теперь посмотрим, что изменилось в таблице: SELECT *



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

END;
COMMIT
А теперь посмотрим, что изменилось в таблице:
SELECT *
FROM aircrafts_tmp;
aircraft_code |
model
| range
---------------+---------------------+-------
321
| Airbus A321-200
| 5600
319
| Airbus A319-100
| 6700
SU9
| Sukhoi SuperJet-100 | 3300
CN1
| Cessna 208 Caravan | 2100
CR2
| Bombardier CRJ-200 | 1900
IL9
| Ilyushin IL96
| 9800
320
| Airbus A320-200
| 5800
(7 строк)
267


Глава 9. Транзакции
Как видим, одна строка добавлена, а значение атрибута range у самолета Airbus
A320-200 стало на 100 больше, чем было. Но до тех пор, пока мы на первом терми-
нале находились в процессе выполнения первой транзакции, все эти изменения не
были ей доступны, поскольку первая транзакция использовала снимок, сделанный
до внесения изменений и их фиксации второй транзакцией.
Теперь покажем ошибки сериализации.
Начнем транзакцию на первом терминале:
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 во второй транзакции видит,
268


9.5. Уровень изоляции Serializable
что строка уже изменена. На уровне изоляции Repeatable Read снимок данных созда-
ется на момент начала выполнения первого запроса транзакции и в течение тран-
закции уже не меняется, т. е. новая версия строки не считывается, как это делалось
на уровне Read Committed. Но если выполнить обновление во второй транзакции без
повторного считывания строки из таблицы, тогда будет иметь место потерянное об-
новление, что недопустимо. В результате генерируется ошибка, и вторая транзакция
откатывается. Мы вводим команду END на втором терминале, но PostgreSQL выпол-
няет не фиксацию (COMMIT), а откат:


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




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

    Басты бет