task_four/transactions.sql

173 lines
5.1 KiB
PL/PgSQL
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';
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,
--влияют на возможность других транзакций заблокировать те же строки или их подмножества/надмножества.
--Конфликты блокировок возникают, когда строки пересекаются или являются надмножеством/подмножеством уже заблокированных строк.