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



Pdf көрінісі
бет193/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   189   190   191   192   193   194   195   196   ...   243
Байланысты:
Язык SQL. Базовый курс

Транзакции
Детальное понимание механизмов выполнения транзакций придет с опытом. В этом разде-
ле мы дадим самое первое представление об этом важном и мощном инструменте, которым
обладают все серьезные СУБД, включая PostgreSQL.
Транзакция — это совокупность операций над базой данных, которые вместе образу-
ют логически целостную процедуру, и могут быть либо выполнены все вместе, либо
не будет выполнена ни одна из них. В простейшем случае транзакция состоит из од-
ной операции.
Транзакции являются одним из средств обеспечения согласованности (непротиво-
речивости) базы данных, наряду с ограничениями целостности (constraints), накла-
дываемыми на таблицы. Транзакция переводит базу данных из одного согласован-
ного состояния в другое согласованное состояние. В качестве примера транзакции
в базе данных «Авиаперевозки» можно привести процедуру бронирования билета.
Она будет включать операции INSERT, выполняемые над таблицами «Бронирования»
(bookings), «Билеты» (tickets) и «Перелеты» (ticket_flights). В результате выполнения
этой транзакции должно обеспечиваться следующее соотношение: значение атрибу-
та total_amount в строке таблицы bookings должно быть равно сумме значений ат-
рибута amount в строках таблицы ticket_flights, связанных с этой строкой таблицы
bookings. Если операции данной транзакции будут выполнены частично, тогда может
оказаться, например, что общая сумма бронирования будет не равна сумме стоимо-
стей перелетов, включенных в это бронирование. Очевидно, что это несогласованное
состояние базы данных.
Транзакция может иметь два исхода: первый — изменения данных, произведенные в
ходе ее выполнения, успешно зафиксированы в базе данных, а второй исход таков —
транзакция отменяется, и отменяются все изменения, выполненные в ее рамках. От-
мена транзакции называется откатом (rollback).
Сложные информационные системы, как правило, предполагают одновременную ра-
боту многих пользователей с базой данных, поэтому современные СУБД предлагают
специальные механизмы для организации параллельного, т. е. одновременного, вы-
полнения транзакций. Реализованы такие механизмы и в PostgreSQL.
Реализация транзакций в СУБД PostgreSQL основана на многоверсионной модели
(Multiversion Concurrency Control, MVCC). Эта модель предполагает, что каждый SQL-
оператор видит так называемый
снимок
данных (snapshot), т. е. то согласованное со-
стояние (версию) базы данных, которое она имела на определенный момент време-
ни. При этом параллельно исполняемые транзакции, даже вносящие изменения в
базу данных, не нарушают согласованности данных этого снимка. Такой результат
в PostgreSQL достигается за счет того, что когда параллельные транзакции изменяют
одни и те же строки таблиц, тогда создаются отдельные
версии
этих строк, доступные
соответствующим транзакциям. Это позволяет ускорить работу с базой данных, од-
нако требует больше дискового пространства и оперативной памяти. И еще одно важ-
ное следствие применения MVCC — операции чтения никогда не блокируются опе-
рациями записи, а операции записи никогда не блокируются операциями чтения.
Согласно теории баз данных, транзакции должны обладать следующими свойства-
ми:
199


1. Атомарность (atomicity). Это свойство означает, что либо транзакция будет за-
фиксирована в базе данных полностью, т. е. будут зафиксированы результаты
выполнения всех ее операций, либо не будет зафиксирована ни одна операция
транзакции.
2. Согласованность (consistency). Это свойство предписывает, чтобы в результате
успешного выполнения транзакции база данных была переведена из одного со-
гласованного состояния в другое согласованное состояние.
3. Изолированность (isolation). Во время выполнения транзакции другие транзак-
ции должны оказывать по возможности минимальное влияние на нее.
4. Долговечность (durability). После успешной фиксации транзакции пользователь
должен быть уверен, что данные надежно сохранены в базе данных и впослед-
ствии могут быть извлечены из нее, независимо от последующих возможных
сбоев в работе системы.
Для обозначения всех этих четырех свойств используется аббревиатура ACID.
При параллельном выполнении транзакций теоретически возможны следующие фе-
номены.
1. Потерянное обновление (lost update). Когда разные транзакции одновременно
изменяют одни и те же данные, то после фиксации изменений может оказаться,
что одна транзакция перезаписала данные, обновленные и зафиксированные
другой транзакцией.
2. «Грязное» чтение (dirty read). Транзакция читает данные, измененные парал-
лельной транзакцией, которая еще не завершилась. Если эта параллельная
транзакция в итоге будет отменена, тогда окажется, что первая транзакция про-
читала данные, которых нет в системе.
3. Неповторяющееся чтение (non-repeatable read). При повторном чтении тех же
самых данных в рамках одной транзакции оказывается, что другая транзакция
успела изменить и зафиксировать эти данные. В результате тот же самый запрос
выдает другой результат.
4. Фантомное чтение (phantom read). Транзакция выполняет повторную выбор-
ку множества строк в соответствии с одним и тем же критерием. В интервале
времени между выполнением этих выборок другая транзакция добавляет но-
вые строки и успешно фиксирует изменения. В результате при выполнении по-
вторной выборки в первой транзакции может быть получено другое множество
строк.
5. Аномалия сериализации (serialization anomaly). Результат успешной фиксации
группы транзакций, выполняющихся параллельно, не совпадает с результатом
ни одного из возможных вариантов упорядочения этих транзакций, если бы они
выполнялись последовательно.
Перечисленные феномены, а также ситуации, в которых они имеют место, будут рас-
смотрены подробно и проиллюстрированы примерами.
Поясним кратко, в чем состоит смысл концепции сериализации. Для двух транзак-
ций, скажем, A и B, возможны только два варианта упорядочения при их последова-
тельном выполнении: сначала A, затем B или сначала B, затем A. Причем результаты
200


реализации двух вариантов могут в общем случае не совпадать. Например, при вы-
полнении двух банковских операций — внесения некоторой суммы денег на какой-то
счет и начисления процентов по этому счету — важен порядок выполнения операций.
Если первой операцией будет увеличение суммы на счете, а второй — начисление
процентов, тогда итоговая сумма будет больше, чем при противоположном порядке
выполнения этих операций. Если описанные операции выполняются в рамках двух
различных транзакций, то оказываются возможными различные итоговые результа-
ты, зависящие от порядка их выполнения.
Сериализация двух транзакций при их


Достарыңызбен бөлісу:
1   ...   189   190   191   192   193   194   195   196   ...   243




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

    Басты бет