Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Неделя 09 Лекция 2 (14).doc
Скачиваний:
1
Добавлен:
13.11.2019
Размер:
93.7 Кб
Скачать

НЕДЕЛЯ

9

ЛЕКЦИЯ

2 (14)

ТЕМА

Транзакции.

Содержание

14.1. Механизмы отката изменений в базе данных. 1

14.2. Определение понятия ‘транзакция’. 2

14.3. Свойства транзакций. 3

14.4. Уровни изоляции транзакций: приложение клиента. 4

14.4.1. Уровень изоляции транзакции Dirty Read. 4

14.4.2. Уровень изоляции транзакции Read Commited. 4

14.4.3. Уровень изоляции транзакции Repeatable Read. 5

14.4.4. Установка уровня изоляции транзакций в Delphi. 5

14.5. Управление транзакциями на SQL-сервере InterBase. 6

14.1. Механизмы отката изменений в базе данных.

Существует несколько способов внесения изменений в таблицы базы данных. Пусть в наборе данных, который ассоциируется с какой-либо таблицей базы данных, выполнено удаление, добавление или корректировка записи.

Для локальных БД (Paradox, dBase и т.д.) характерен подход немедленного отображения изменений. Когда выполняется метод Post, изменения, внесенные в запись НД, немедленно физически запоминаются в таблице базы данных, ассоциированной с этим набором данных. То же верно и для метода Delete – после него запись немедленно физически удаляется из таблицы базы данных, ассоциированной с этим набором данных.

Отказаться от изменения таблицы базы данных в этом случае невозможно – ведь изменения уже физически внесены в нее. Правда, удаленную запись можно ввести заново вручную. Или – другой вариант – удаленные записи можно сохранять в некоторой промежуточной (временной) таблице базы данных. В случае запроса на отказ от удаления записи из этой таблицы можно перемещать в ту таблицу базы данных, из которой произошло удаление.

Необходимость отката изменений обусловливается еще и тем обстоятельством, что база данных всегда должна находиться в целостном состоянии. Классическим примером перехода базы данных из одного целостного состояния в другое является бухгалтерская проводка, когда некоторая сумма S должна быть списана со счета К и зачислена на счет D. Только успешное выполнение этих двух операций гарантирует целостность информации в базе данных. Но целостность будет нарушена, если в результате сбоя сумма S будет списана со счета К, но не будет зачислена на счет D или, наоборот, зачислена на D, но не списана с К. Поэтому в случае ошибки списания/зачисления суммы результаты предыдущей операции зачисления/списания должны быть отменены.

Существуют механизмы отката изменений в БД в случае невыполнения условия успешного завершения всех операций в составе группы. Один из таких механизмов носит название обработка транзакций. Обычно обработка транзакций реализуется в промышленных базах данных. Однако ряд средств разработки приложений (Delphi, CBilder) позволяют управлять транзакциями и для таблиц локальных СУБД (Paradox, dBase). Кроме того, как для промышленных, так и локальных в этих средствах разработки предоставляется дополнительный механизм управления откатами изменений в базе данных – так называемые "кэшированные изменения" (cached updates, что часто переводят так же как "буферизованные изменения").

14.2. Определение понятия ‘транзакция’.

Транзакция – это действие или серия действий, выполняемых одним пользователем или прикладной программой, которые осуществляют доступ или изменение содержимого базы данных.

Транзакция является логической единицей работы, выполняемой в базе данных. Она может быть представлена отдельной программой, являться частью алгоритма программы или даже отдельной командой (например, командой INSERT или UPDATE языка SQL) и включать произвольное количество операций, выполняемых в базе данных. С точки зрения базы данных, выполнение программы некоторого приложения может расцениваться как серия транзакций, в промежутках между которыми выполняется некоторая обработка данных, осуществляемая вне среды базы данных.

Любая транзакция всегда должна переводить базу данных из одного согласованного состояния в другое, хотя допускается, что согласованность состояния базы будет нарушаться в ходе выполнения транзакции. Поэтому, любая транзакция завершается одним из двух возможных способов. В случае успешного завершения результаты транзакции фиксируются (commit) в базе данных, и она переходит в новое согласованное состояние. Если выполнение транзакции не увенчалось успехом, она отменяется (rollback). В этом случае в базе данных должно быть восстановлено то согласованное состояние, в котором она находилась до начала данной транзакции. Этот процесс называется откатом (rollback) транзакции. Зафиксированная транзакция не может быть отменена. Если оказывается, что зафиксированная транзакция была ошибочной, потребуется выполнить другую транзакцию, отменяющую действия, выполненные первой транзакцией. В некоторых случаях эту транзакцию называют компенсирующей. Следует отметить, что отмененная транзакция может быть еще раз запущена позже и, в зависимости от причин предыдущего отказа, вполне успешно завершена и зафиксирована в базе данных.

Никакая СУБД не обладает внутренней возможностью установить, какие именно изменения должны быть восприняты как единое целое, образующее одну логическую транзакцию. Следовательно, должен существовать метод, позволяющий указывать границы каждой из транзакций извне, со стороны пользователя. В большинстве языков манипулирования данными для указания границ отдельных транзакций используются операторы BEGIN TRANSACTION, COMMIT и ROLLBACK (или их эквиваленты). Если эти ограничители не были использованы, вся выполняемая программа расценивается как единая транзакция. СУБД автоматически выполнит команду COMMIT при нормальном завершении этой программы. Аналогично, в случае ее аварийного завершения в базе данных автоматически будет выполнена команда ROLLBACK.