task_four/task

123 lines
4.6 KiB
Plaintext
Raw Normal View History

2024-12-08 16:24:46 +00:00
--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;
--вторая транзакция заблокировала строки, не пересекающиеся с теми, которые заблокированы первой транзакцией
2024-12-08 16:25:30 +00:00
--вывод:в режиме изоляции Read Committed блокировки, установленные через SELECT ... FOR UPDATE, ограничивают возможность других транзакций блокировать те же строки или их подмножества/надмножества; конфликты блокировок возникают, если строки пересекаются либо находятся в отношении подмножества или надмножества с уже заблокированными строками