Загрузить файлы в «/»
This commit is contained in:
commit
b650438ad5
173
transactions.sql
Normal file
173
transactions.sql
Normal file
@ -0,0 +1,173 @@
|
||||
-------------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,
|
||||
--влияют на возможность других транзакций заблокировать те же строки или их подмножества/надмножества.
|
||||
--Конфликты блокировок возникают, когда строки пересекаются или являются надмножеством/подмножеством уже заблокированных строк.
|
Loading…
Reference in New Issue
Block a user