SELECT *
FROM aircrafts_tmp
WHERE model ~ '^Air'
FOR UPDATE;
aircraft_code |
model
| range
---------------+-----------------+-------
320
| Airbus A320-200 | 5700
321
| Airbus A321-200 | 5600
319
| Airbus A319-100 | 6700
(3 строки)
На втором терминале организуйте аналогичную транзакцию и выполните точно та-
кую же команду. Вы увидите, что ее выполнение будет приостановлено.
SELECT *
FROM aircrafts_tmp
WHERE model ~ '^Air'
FOR UPDATE;
278
9.7. Блокировки
На первом терминале обновите одну строку, а затем завершите транзакцию:
UPDATE aircrafts_tmp
SET range = 5800
WHERE aircraft_code = '320';
UPDATE 1
Перейдя на второй терминал, вы увидите, что там была, наконец, выполнена выбор-
ка, которая показала уже измененные данные:
aircraft_code |
model
| range
---------------+-----------------+-------
320
| Airbus A320-200 | 5800
321
| Airbus A321-200 | 5600
319
| Airbus A319-100 | 6700
(3 строки)
Завершите и вторую транзакцию.
Аналогичным образом можно организовать блокировки на уровне таблиц. Также на
первом терминале организуйте транзакцию с уровнем изоляции Read Committed и
выполните команду блокировки всей таблицы в самом строгом режиме, в котором
другим транзакциям доступ к этой таблице запрещен полностью:
LOCK TABLE aircrafts_tmp
IN ACCESS EXCLUSIVE MODE;
LOCK TABLE
На втором терминале выполните совершенно «безобидную» команду:
SELECT *
FROM aircrafts_tmp
WHERE model ~ '^Air';
Вы увидите, что выполнение команды SELECT на втором терминале будет задержа-
но. Прервите транзакцию на первом терминале командой ROLLBACK. Вы увидите, что
на втором терминале команда будет успешно выполнена.
Более подробно ознакомиться с различными видами блокировок уровня строки и
уровня таблицы можно с помощью документации (раздел 13.3 «Явные блокировки»).
279
Глава 9. Транзакции
Достарыңызбен бөлісу: |