Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
129.69 Кб
Скачать

8. Понятие транзакции и её необходимость. Операторы commit, rollback.

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

Понятие транзакции имеет непосредственное отношение к целостности БД. СУБД автоматически следит, чтобы каждая отдельная команда SQL не нарушала целостность БД. В этом случае речь идет только о декларативной и ссылочной целостности. Что касается логической или семантической целостности, то существуют такие ограничения, накладываемые на БД, которые просто невозможно не нарушить, выполнив только один SQL-оператор. Для обеспечения логической целостности иногда необходимо успешное выполнение целой группы операторов, объединенных в транзакцию, например, перевод денег с одного счета на другой в банковской системе. Данная операция может состоять минимум из двух операций: снятие денег с одного счета (один оператор UPDATE или DELETE) и принятие денег на другой счет (еще один оператор UPDATE или INSERT). Если после выполнения первого действия оказывается, что второе действие совершить невозможно (например, счет закрыт), то возникает неоднозначная ситуация – куда в итоге денутся деньги? Для разрешения подобных ситуаций и используют механизм транзакций.

Если все операторы выполнены успешно, и в процессе выполнения транзакции не произошло никаких сбоев программного или аппаратного обеспечения, транзакция фиксируется.

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

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

Откат транзакции — действие, обеспечивающее аннулирование всех изменений данных, которые были сделаны операторами SQL в теле текущей незавершенной транзакции.

Кроме выполнения явной фиксации транзакции (COMMIT) или явного отката транзакции (ROLLBACK) существует возможность неявного выполнения этих команд, то есть без непосредственного указания одной из этих двух команд пользователем.

Неявная фиксация транзакции, например, осуществляется самой СУБД в том случае, когда выполняется один из операторов DDL (CREATE, ALTER или DROP). Данные операторы изменяют схему базы данных, а с точки зрения согласованности данных это невозможно до тех пор, пока существуют незавершенные транзакции, поэтому СУБД сама автоматически пытается зафиксировать все текущие транзакции в той схеме, которую собираются изменить.

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

Существует три оператора, предназначенных для управления транзакциями:

COMMIT – явная фиксация транзакции;

ROLLBACK – явная отмена изменения в текущей транзакции;

SAVEPOINT – создание контрольной точки внутри транзакции (промежуточная фиксация транзакции с возможность отката к этой точке).

Пример выполнения DML операторов с фиксацией и откатом транзакций:

1. транзакция начинается автоматически послеустановки соединения с БД:

INSERT INTO MANAGERS(Man_Id, Name, Procent)

VALUES(100, ‘Иванов М.А.’, 5);

2. промежуточная фиксация транзакции

SAVEPOINT Insert1ok;

3. выполнение очередной команды DML

UPDATE MANAGERS SET Procent=15 WHERE Man_Id=100;

4. откат транзакции до контрольной точки Insert1ok

ROLLBACK TO Insert1ok;

5. откорректированная команда DML

UPDATE MANAGERS SET Procent=16 WHERE Man_Id=100;

6. фиксация транзакции и начало новой транзакции

COMMIT;

7. очередная команда DML

DELETE FROM MANAGERS;

8. отмена всех изменений в текущей транзакции (возврат БД к состоянию до пункта 6)

ROLLBACK;

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