Транзакции

 

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

Пример транзакции: выбор сведений из БД о заданном физическом лице; изменение паспортных данных; подтверждение изменений (сохранение).

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

1 Атомарность (atomicity). Предполагает, что транзакция должна быть либо завершена, либо не выполнена вовсе. Входящие в транзакцию операции выступают вместе как неделимая единица работы, т.е. либо все операции успешно завершаются, либо отменяются.

2 Непротиворечивость, постоянство (consistency). После завершения транзакции система должна находиться в известном состоянии, т.е. транзакция не должна оставлять после себя следов. С точки зрения стороннего наблюдателя, система находится в непротиворечивом состоянии и до начала, и после завершения транзакции.

3 Изолированность (isolation). Транзакция должна быть изолирована, т.е. не должна влиять на другие транзакции и зависеть от них. Зависимость вызывает тупиковые ситуации (deadlocks), т.е. в ходе выполнения одна транзакция не должна «видеть» изменений, сделанных другими незавершенными транзакциями.

4 Устойчивость, продолжительность, долговечность (durability). Если транзакция завершена, и цель её достигнута, то не может быть никаких веских причин для её отката. По этой причине важные операции с таблицей выполняются за одну транзакцию. Должна обеспечиваться независимость сохранности изменений, совершенных транзакцией, и при сбоях аппаратного обеспечения АИС (внезапная перезагрузка, поломка оборудования).

Существуют некоторые действия, которые нельзя выполнить в транзакции. Их либо выполняет АБД, либо они фиксируются в журнале транзакций для возможного дальнейшего дословного восстановления системы. Это действия: изменение структуры объектов БД; создание объектов БД; переконфигурация системы; обновление статистики работы системы. Перед выполнением этих операций предварительно делается резервная копия БД.

В большинстве языках манипулирования данными разных СУБД для указания границ отдельных транзакций используются операторы: начать транзакцию (Begin Transaction) – явный запуск транзакции; завершить транзакцию (Commit); отменить транзакцию (Rollback).

В стандарте SQL указывается, что транзакция запускается любым SQL оператором, выполняемым пользователем или программой (Select, Insert, Update), это, так называемый, неявный запуск транзакции. Вся выполняемая программа может рассматриваться СУБД как единая транзакция.

Завершение транзакции может быть выполнено одним из 4—х способов.

1 Ввод оператора Commit означает успешное завершение транзакции. После его выполнения внесенные в БД изменения приобретают постоянный характер.

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

3 При внедрении SQL команды в текст программы успешное окончание работы программы автоматически вызовет завершение последней запущенной транзакции, даже если оператор Commit не был явно введен.

4 При внедрении SQL команды в текст программы аварийное завершение этой программы автоматически вызовет откат последней запущенной этой программой транзакции.

Зафиксированная транзакция не может быть отменена. Если оказалось, что зафиксированная транзакция была ошибочной, потребуется выполнить другую транзакцию, отменяющую действие первой.

Более подробно технология работы с транзакциями может быть представлена в технической документации выбранной СУБД.

При работе с БД в многопользовательском режиме необходимо знать о проблемах, которые могут возникнуть в связи с параллелизмом процессов. Термин параллелизм означает, что СУБД имеет возможность одновременно обрабатывать много транзакций, осуществляющих доступ к одним и тем же данным в одно и то же время.