-------------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'; SELECT * FROM aircrafts_tmp 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 | Сессна 208 Караван | 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; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 6000 FOR UPDATE; --на втором BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 7000 FOR UPDATE; --Вторая транзакция не выполняется, потому что ей не даёт первая. ----2. Выборка надмножества----- --на первом BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 6000 FOR UPDATE; --на втором BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 5000 FOR UPDATE; --Вторая транзакция не блокирует строки, которые являются надмножеством строк, --заблокированных первой транзакцией, потому что происходит конфликт блокировок. ----3. Пересечение множеств----- --на первом BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 6000 FOR UPDATE; --на втором BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 5000 AND range < 8000 FOR UPDATE; --Вторая транзакция не блокирует строки, которые пересекаются с строками, --заблокированных первой транзакцией, потому что происходит конфликт блокировок. ---4. Непересечение множеств---- --на первом BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range > 6000 FOR UPDATE; --на втором BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM aircrafts_tmp WHERE range < 2000 FOR UPDATE; --Вторая транзакция заблокировала строки, --которые не пересекаются с строками, заблокированных первой транзакцией. --Итог: на уровне изоляции Read Committed блокировки, установленные с помощью SELECT ... FOR UPDATE, --влияют на возможность других транзакций заблокировать те же строки или их подмножества/надмножества. --Конфликты блокировок возникают, когда строки пересекаются или являются надмножеством/подмножеством уже заблокированных строк.