Загрузить файлы в «/»
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