Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_14.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
202.75 Кб
Скачать

Понятие транзакции

В большинстве баз данных работа с данными организована в форме транзакций (transactions). Впервые понятие транзакции вводилось в лекции № 1. Транзакция – это последовательность действий с базой данных, в которой либо все действия выполняются успешно, либо не выполняется ни одно из них, т.е. база данных остается без изменений. Такая последовательность действий называется также атомарной (atomic), так как она выполняется как единое целое.

Определение транзакции из Википедии: «Транза́кция (англ.  transaction) — группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще и тогда она не должна произвести никакого эффекта».

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

Но часто транзакции как программные процедуры работы с данными являются более сложными и многоступенчатыми. Например, пусть в базе данных банковских счетов нужно перевести средства с одного счета на другой. Для этого нужно уменьшить на нужную сумму баланс одного счета и увеличить на ту же сумму баланс другого счета. Операция «перевод суммы между счетами» является транзакцией. На языке SQL это осуществляется с помощью следующих двух инструкций:

UPDATE счета

SET баланс = баланс -100

WHERE номер_счета = 950;

UPDATE счета

SET баланс = баланс +100

WHERE номер_счета = 5200;

Если между выполнением этих двух команд UPDATE произойдет сбой, то это приведет к ошибке в БД. Баланс одного счета уменьшится, а второго не увеличится. В таком случае лучше, чтобы ни один из операторов не был выполнен, и БД должна возвратиться в исходное состояние, т.е. должен произойти откат транзакции.

Поэтому необходимы специальные операторы для правильного завершения транзакций.

В языке SQL для этих целей предусмотрены два оператора:

  • COMMIT - завершить выполнение транзакции (фиксация, англ. сommit - фиксировать), в результате все изменения в БД становятся зафиксированными, постоянными и переносятся во внешнюю память.

  • ROLLBACK – откат, возврат к предыдущему состоянию. Происходит отмена всех действий транзакции с момента последнего оператора COMMIT. БД возвращается в исходное состояние, в котором была до начала транзакции.

Программа может состоять из нескольких транзакций. Для указания конца каждой транзакции используется оператор COMMIT или ROLLBACK. Программа с несколькими транзакциями должна иметь следующий вид:

Начало программы

SQL – операторы транзакции 1;

COMMIT или ROLLBACK;

SQL – операторы транзакции 2;

COMMIT или ROLLBACK;

………………………………

SQL – операторы транзакции N;

COMMIT или ROLLBACK;

Конец программы

Т.о., каждая инструкция SQL является отдельной, атомарной транзакцией.

Пример процедуры:

UPDATE счета

SET баланс = баланс -100

WHERE номер_счета = 950;

UPDATE счета

SET баланс = баланс +100

WHERE номер_счета = 5200;

COMMIT;

Это означает, что первое обновление счета – не окончательное, а промежуточное. Изменения в записи с номером счета 950 произойдут в ОП и не будут записаны на диск, пока не завершится второе обновление и не выполнится команда фиксации транзакции. Теперь если между выполнением первого и второго оператора произойдет сбой, результат первого обновления не будет записан на диск, т.к. не будет выполнен COMMIT, и БД останется в прежнем состоянии. После выполнения COMMIT результаты записываются на диск, т.е. в файл БД.

Для отката транзакции, если она не завершилась, должна использоваться инструкция ROLLBACK.