commit afccf04380034c5ca07ff3b957079e84c09533b7 Author: zxckawory Date: Sun Dec 8 16:24:46 2024 +0000 Добавить task diff --git a/task b/task new file mode 100644 index 0000000..8b61379 --- /dev/null +++ b/task @@ -0,0 +1,123 @@ +--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, ограничивают возможность других транзакций блокировать те же строки или их подмножества/надмножества; конфликты блокировок возникают, если строки пересекаются либо находятся в отношении подмножества или надмножества с уже заблокированными строками \ No newline at end of file