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