task_four/task
2024-12-08 16:25:30 +00:00

123 lines
4.6 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--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, ограничивают возможность других транзакций блокировать те же строки или их подмножества/надмножества; конфликты блокировок возникают, если строки пересекаются либо находятся в отношении подмножества или надмножества с уже заблокированными строками