Учебно-практическое пособие москва 2017 ббк



Pdf көрінісі
бет212/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   208   209   210   211   212   213   214   215   ...   243
Байланысты:
Язык SQL. Базовый курс

CREATE TABLE modes AS
SELECT num::integer, 'LOW' || num::text AS mode
FROM generate_series( 1, 100000 ) AS gen_ser( num )
UNION ALL
SELECT num::integer, 'HIGH' || ( num - 100000 )::text AS mode
FROM generate_series( 100001, 200000 ) AS gen_ser( num );
SELECT 200000
Проиндексируем таблицу по числовому столбцу.
CREATE INDEX modes_ind ON modes ( num );
CREATE INDEX
Из всего множества строк нас будут интересовать только две:
SELECT * FROM modes WHERE mode IN ( 'LOW1', 'HIGH1' );
223


num
| mode
--------+-------
1 | LOW1
100001 | HIGH1
(2 строки)
На первом терминале начнем транзакцию и обновим одну строку из тех двух
строк, которые были показаны в предыдущем запросе.
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN
UPDATE modes SET mode = 'HIGH1' WHERE num = 1;
UPDATE 1
На втором терминале тоже начнем транзакцию и обновим другую строку из тех
двух строк, которые были показаны выше.
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN
UPDATE modes SET mode = 'LOW1' WHERE num = 100001;
UPDATE 1
Обратите внимание, что обе команды UPDATE были выполнены, ни одна из них
не ожидает завершения другой транзакции.
Попробуем завершить транзакции. Сначала — на первом терминале:
COMMIT;
COMMIT
А потом на втором терминале:
COMMIT;
COMMIT
Посмотрим, что получилось.
SELECT * FROM modes WHERE mode IN ( 'LOW1', 'HIGH1' );
num
| mode
--------+-------
1 | HIGH1
100001 | LOW1
(2 строки)
Теперь система смогла сериализовать параллельные транзакции и зафиксиро-
вать их обе. Как вы думаете, почему это удалось? Обосновывая ваш ответ, при-
мите во внимание тот результат, который был бы получен при последователь-
ном выполнении транзакций.
224


10.* В тексте главы был рассмотрен пример транзакции над таблицами базы дан-
ных «Авиаперевозки». Давайте теперь создадим две параллельные транзакции
и выполним их с уровнем изоляции SERIALIZABLE. Отправим также двоих пас-
сажиров теми же самыми рейсами, что и ранее, но операции распределим меж-
ду двумя транзакциями. Отличие заключается в том, что в начале транзакции
будут выполняться выборки из таблицы ticket_flights. Для упрощения ситуации
не будем предварительно проверять наличие свободных мест, т. к. сейчас для
нас важно не это. Итак, первая транзакция:


Достарыңызбен бөлісу:
1   ...   208   209   210   211   212   213   214   215   ...   243




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет