|
| ||||||||||||
| ||||||||||||
|
2008 г.
Базы данных. Вводный курсСергей КузнецовЛекция 13. Методы управления транзакциями. Сихронизационные блокировки, временные метки и версии13.1. ВведениеПоддержка механизма транзакций – показатель уровня развитости СУБД. Корректное поддержание транзакций одновременно является основой обеспечения целостности баз данных (и поэтому транзакции вполне уместны и в однопользовательских персональных СУБД), а также составляют базис изолированности пользователей в многопользовательских системах. Часто эти два аспекта рассматриваются по отдельности, но на самом деле они взаимосвязаны, что и будет показано в этой лекции. 13.2. Общее понятие транзакции и основные характеристики транзакцийБолее точно, в современных СУБД поддерживается понятие транзакции, характеризуемое аббревиатурой ACID (Atomicy, Consistency, Isolation и Durability). В соответствии с этим понятием под транзакцией разумеется последовательность операций над базой данных, обладающая следующими свойствами.
Заметим, что хотя с точки зрения обеспечения целостности баз данных механизм транзакций следовало бы поддерживать в персональных СУБД, на практике это обычно не выполняется. Поэтому при переходе от персональных к многопользовательским СУБД пользователи сталкиваются с необходимостью четкого понимания природы транзакций. 13.2.1. Атомарность транзакцийВ этом смысле под транзакцией понимается неделимая с точки зрения воздействия на БД последовательность операторов манипулирования данными (чтения, удаления, вставки, модификации), такая, что либо результаты всех операторов, входящих в транзакцию, отображаются в состоянии базы данных, либо воздействие всех этих операторов полностью отсутствует. Лозунгом
транзакции является «Все или ничего»: при завершении
транзакции оператором Каким образом в СУБД поддерживаются индивидуальные откаты транзакций, описывается в лекции 14. 13.2.2. Транзакции и целостность баз данныхПонятие
транзакции имеет непосредственную связь с понятием целостности базы
данных. Очень часто база данных может обладать такими ограничениями
целостности, которые просто невозможно не нарушить, выполняя только
один оператор изменения базы данных. Например, в базе данных
Поэтому
для поддержки подобных ограничений целостности допускается их
нарушение внутри транзакции с тем условием, чтобы к моменту
завершения транзакции условия целостности были соблюдены. В системах
с развитыми средствами ограничения и контроля целостности каждая
транзакция начинается при целостном состоянии базы данных и должна
оставить это состояние целостными после своего завершения.
Несоблюдение этого условия приводит к тому, что вместо фиксации
результатов транзакции происходит ее откат (т.е. вместо оператора
Более точно, различаются два вида ограничений целостности: немедленно проверяемые и откладываемые. К немедленно проверяемым ограничениям целостности относятся такие ограничения, проверку которых бессмысленно или даже невозможно откладывать. Примером ограничения, проверку которого откладывать бессмысленно, являются ограничения домена (например, возраст сотрудника не может превышать 150 лет). Более сложным ограничением, проверку которого невозможно отложить, является следующее: зарплата сотрудника не может быть увеличена за одну операцию более чем на 100000 рублей. Немедленно проверяемые ограничения целостности соответствуют уровню отдельных операторов языкового уровня СУБД. При их нарушениях не производится откат транзакции, а лишь отвергается соответствующий оператор. Откладываемые
ограничения целостности – это ограничения на базу данных, а не
на какие-либо отдельные операции. По умолчанию такие ограничения
проверяются при конце транзакции, и их нарушение вызывает
автоматическую замену оператора Заметим,
что концептуально в момент завершения транзакции проверяются все
откладываемые ограничения целостности, определенные в этой базе
данных. Однако
в реализации
стремятся при
выполнении транзакции динамически выделить те ограничения
целостности, которые действительно могли бы быть нарушены. Например,
если при выполнении транзакции над базой данных Понятно, что описанный механизм поддержки целостности баз данных обеспечивает требуемое свойство транзакций: никакая транзакция не может быть зафиксирована, если ее действия нарушили целостность базы данных. Однако в этом подходе имеются два серьезных дефекта. Во-первых,
если при выполнении транзакции не устанавливать точки сохранения и
не проверять периодически соответствие текущего состояния базы
данных (с точки зрения данной транзакции) ограничениям целостности,
то долговременно выполняемая транзакция вполне вероятно может быть
«откачена» системой при выполнении завершающего
оператора Простое
и элегантное решение этой проблемы предлагается в [1.5]. Авторы
предлагают отказаться от откладываемых
ограничений целостности базы данных, а вместо этого ввести составные
операторы изменения базы данных (нечто наподобие блоков Интересно, что для реализации описанного подхода не требуются какие-либо новые механизмы, кроме точек сохранения транзакции, насильственной проверки ограничений целостности и частичных откатов транзакций, а отмеченные ранее проблемы снимаются. К сожалению, насколько известно автору данной книги, этот подход на практике пока не применяется. 13.2.3. Изолированность транзакцийВ многопользовательских системах с одной базой данных одновременно может работать несколько пользователей или прикладных программ. Предельной задачей системы является обеспечение изолированности пользователей, т.е. создание достоверной и надежной иллюзии того, что каждый из пользователей работает с базой данных в одиночку. В связи со свойством сохранения целостности базы данных транзакции являются подходящими единицами изолированности пользователей. Действительно, если с каждым сеансом работы пользователя или приложений с базой данных ассоциируется транзакция, то каждый пользователь начинает работу с согласованным состоянием базы данных, т.е. с таким состоянием, в котором база данных могла бы находиться, даже если бы пользователь работал с ней в одиночку. При соблюдении обязательного требования поддержки целостности базы данных возможно наличие нескольких уровней изолированности транзакций. Заметим, что впервые эти уровни изолированности транзакций были установлены и описаны участниками проекта System R. Отсутствие потерянных изменений (первый уровень изолированности)Рассмотрим
сценарий совместного выполнения двух транзакций, показанный на рис.
13.1. В момент времени
Тогда
при повторном чтении объекта Такая
ситуация называется ситуацией потерянных
изменений.
Естественно, она противоречит требованию изолированности
пользователей. Чтобы избежать такой ситуации в транзакции Отсутствие чтения «грязных» данных (второй уровень изолированности)Рассмотрим
сценарий совместного выполнения транзакций Эта
ситуация тоже не соответствует требованию изолированности
пользователей (каждый пользователь начинает свою транзакцию при
согласованном состоянии базы данных и имеет право
видеть
только согласованные данные). Чтобы избежать ситуации чтения
"грязных" данных, до завершения транзакции Отсутствие неповторяющихся чтений (третий уровень изоляции)Рассмотрим
сценарий совместного выполнения транзакций
Чтобы
избежать неповторяющихся
чтений,
до завершения транзакции Заметим, что существует возможность обеспечения разных уровней изолированности для разных транзакций, выполняющихся в одной системе баз данных (кстати, соответствующие операторы были предусмотрены уже в стандарте SQL:1992). Как уже отмечалось, для корректного соблюдения ограничений целостности достаточен первый уровень. Существует ряд приложений, которым хватает первого уровня изолированности (например, прикладные или системные статистические утилиты, для которых некорректность индивидуальных данных несущественна). При этом удается существенно сократить накладные расходы СУБД и повысить общую эффективность. Проблема фантомовК более тонким проблемам изолированности транзакций относится так называемая проблема кортежей-«фантомов», приводящая к ситуациям, которые также противоречат изолированности пользователей. Рассмотрим сценарий, показанный на рис. 13.4. В
момент времени Конечно, такая ситуация противоречит идее изолированности транзакций и может возникнуть даже на третьем уровне изолированности транзакций. Чтобы избежать появления кортежей-фантомов, требуется более высокий «логический» уровень изоляции транзакций. Идеи требуемого механизма (предикатные синхронизационные блокировки) появились также еще во время выполнения проекта System R, но в большинстве систем не реализованы. 13.2.4. Сериализация транзакцийЧтобы добиться изолированности транзакций, в СУБД должны использоваться какие-либо методы регулирования совместного выполнения транзакций. Пусть
в системе одновременно выполняется некоторое множество транзакций Сериализация транзакций – это механизм их выполнения по некоторому сериальному плану. Обеспечение такого механизма является основной функцией компонента СУБД, ответственного за управление транзакциями. Система, в которой поддерживается сериализация транзакций, обеспечивает реальную изолированность пользователей. Основная реализационная проблема состоит в выборе метода сериализации набора транзакций, который не слишком ограничивал бы чередование их операций или реальную параллельность. Приходящим на ум тривиальным решением является действительно последовательное выполнение транзакций. Но существуют ситуации, в которых можно выполнять операторы разных транзакций в любом порядке с сохранением свойства сериальности. Примерами могут служить только читающие транзакции, а также транзакции, не конфликтующие по объектам базы данных. Между
транзакциями
Практические методы сериализации транзакций основываются на учете этих конфликтов. |
|
CITForum © 1997–2025