--task 1 CREATE TABLE aircrafts_tmp AS SELECT * FROM aircrafts; --на первом терминале BEGIN ISOLATION LEVEL READ COMMITTED; SHOW transaction_isolation; UPDATE aircrafts_tmp SET range = range + 100 WHERE aircraft_code = 'SU9'; --на втором терминале BEGIN; UPDATE aircrafts_tmp SET range = range + 200 WHERE aircraft_code = 'SU9'; --команда будет не активна, пока не завершится первая транзакция COMMIT; --в первый терминал; update происходит мнгновенно во втором терминале --на втором терминале SELECT * FROM aircrafts_tmp WHERE aircraft_code = 'SU9'; end; --на первом терминале begin; SELECT * FROM aircrafts_tmp --на втором терминале begin; DELETE FROM aircrafts_tmp WHERE model ~ '^Boe'; SELECT * FROM aircrafts_tmp; end; --на первом терминале SELECT * FROM aircrafts_tmp; end; --task 2 --на первом терминале begin; SELECT * FROM aircrafts_tmp WHERE range < 2000; UPDATE aircrafts_tmp SET range = 2100 WHERE aircraft_code = 'CN1'; UPDATE aircrafts_tmp SET range = 1900 WHERE aircraft_code = 'CR2'; --на втором терминале BEGIN; SELECT * FROM aircrafts_tmp WHERE range < 2000; DELETE FROM aircrafts_tmp WHERE range < 2000; --была удалена строка: CN1 | Cessna 208 Caravan | 1200 --на первом терминале rollback; end; SELECT * FROM aircrafts_tmp; --task 4 --на первом терминале begin; SELECT * FROM aircrafts_tmp WHERE range > 6000; --на втором терминале BEGIN; INSERT INTO aircrafts_tmp (aircraft_code, model, range) VALUES ('new', 'New Aircraft Model', 6100); end; --на первом терминале SELECT * FROM aircrafts_tmp WHERE range > 6000; end; -- aircraft_code | model | range -----------------+--------------------+------- -- 773 | Боинг 777-300 | 11100 -- 763 | Боинг 767-300 | 7900 -- 319 | Аэробус A319-100 | 6700 -- new | New Aircraft Model | 6100 --task 5 --1 -- на первом терминале BEGIN ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 6000 FOR UPDATE; --на втором терминале BEGIN ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 7000 FOR UPDATE; --вторая транзакция не будет выполняться, так как её блокирует первая --2 --на первом терминале BEGIN ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 6000 FOR UPDATE; --на втором терминале BEGIN ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 5000 FOR UPDATE; --вторая транзакция не блокирует строки, которые включают в себя строки, уже заблокированные первой транзакцией, из-за конфликта блокировок --3 --на первом терминале BEGIN ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 6000 FOR UPDATE; --на втором терминале BEGIN ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 5000 AND range < 8000 FOR UPDATE; --вторая транзакция не блокирует строки, пересекающиеся с теми, которые заблокированы первой транзакцией, из-за конфликта блокировок --4 --на первом терминале BEGIN ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 6000 FOR UPDATE; --на втором терминале BEGIN ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range < 2000 FOR UPDATE; --вторая транзакция заблокировала строки, не пересекающиеся с теми, которые заблокированы первой транзакцией --Вывод:в режиме изоляции Read Committed блокировки, установленные через SELECT ... FOR UPDATE, ограничивают возможность других транзакций блокировать те же строки или их подмножества/надмножества; конфликты блокировок возникают, если строки пересекаются либо находятся в отношении подмножества или надмножества с уже заблокированными строками