Учебное пособие Санкт-Петербург «бхв-петербург»



Pdf көрінісі
бет219/256
Дата18.11.2022
өлшемі1.88 Mb.
#465124
түріУчебное пособие
1   ...   215   216   217   218   219   220   221   222   ...   256
sql osnovi yazika

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' );
num
| mode
--------+-------
1 | LOW1
100001 | HIGH1
(2 строки)
На первом терминале начнем транзакцию и обновим одну строку из тех двух
строк, которые были показаны в предыдущем запросе.
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN
UPDATE modes
SET mode = 'HIGH1'
WHERE num = 1;
UPDATE 1
287


Глава 9. Транзакции
На втором терминале тоже начнем транзакцию и обновим другую строку из тех
двух строк, которые были показаны выше.
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 строки)
Теперь система смогла сериализовать параллельные транзакции и зафиксиро-
вать их обе. Как вы думаете, почему это удалось? Обосновывая ваш ответ, при-
мите во внимание тот результат, который был бы получен при последователь-
ном выполнении транзакций.
288


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


Достарыңызбен бөлісу:
1   ...   215   216   217   218   219   220   221   222   ...   256




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

    Басты бет