From b650438ad53fe3b3e522045e6fcbd142aa49db47 Mon Sep 17 00:00:00 2001 From: zxcdenjir Date: Wed, 4 Dec 2024 20:49:05 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?/=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- transactions.sql | 173 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 transactions.sql diff --git a/transactions.sql b/transactions.sql new file mode 100644 index 0000000..435c9b9 --- /dev/null +++ b/transactions.sql @@ -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, +--влияют на возможность других транзакций заблокировать те же строки или их подмножества/надмножества. +--Конфликты блокировок возникают, когда строки пересекаются или являются надмножеством/подмножеством уже заблокированных строк. \ No newline at end of file