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