Глава 9. Транзакции Очевидно, что сохранится только одно из значений атрибута range. Можно ли
говорить, что в такой ситуации имеет место потерянное обновление? Если оно
имеет место, то что можно предпринять для его недопущения? Обоснуйте ваш
ответ.
Для получения дополнительной информации можно обратиться к фундамен-
тальному труду К. Дж. Дейта, а также к полному руководству по SQL Дж. Гроффа,
П. Вайнберга и Э. Оппеля. Библиографические описания этих книг приведены
в списке рекомендуемой литературы.
4. На уровне изоляции транзакций Read Committed имеет место такой феномен,
как чтение фантомных строк. Такие строки могут появляться в выборке как в ре-
зультате добавления новых строк параллельной транзакцией, так и вследствие
изменения ею значений атрибутов, участвующих в формировании условия вы-
борки. Рассмотрим пример, иллюстрирующий вторую из указанных причин.
На первом терминале организуем транзакцию. Она будет иметь уровень изоля-
ции Read Committed:
BEGIN; BEGIN
SELECT * FROM aircrafts_tmp WHERE range > 6000; aircraft_code |
model
| range
---------------+-----------------+-------
773
| Boeing 777-300 | 11100
763
| Boeing 767-300 | 7900
319
| Airbus A319-100 | 6700
(3 строки)
На втором терминале организуем транзакцию и обновим одну из строк табли-
цы таким образом, чтобы эта строка стала удовлетворять условию отбора строк,
заданному в первой транзакции.
BEGIN; BEGIN
284
Контрольные вопросы и задания UPDATE aircrafts_tmp SET range = 6100 WHERE aircraft_code = '320'; UPDATE 1
Сразу завершим вторую транзакцию, чтобы первая транзакция увидела эти из-
менения.