Транзакция - логическая единица работы в базе данных а так же единица восстановления информации при сбое СУБД.
Особенности реализации транзакций:
- Неявные транзакции. Транзакция автоматически начитается или с начала сеанса или с момента окончания предыдущей транзакции.
- Типы транзакций - Read Write, Read Only. Транзакция Read Only эквивалентна при чтении уровню изолированности SERIALIZABLE. Такая транзакция видит только изменения, зафиксированные на момент ее начала, но в этом режиме не разрешена вставка, изменение и удаление данных (другие сеансы могут изменять данные, но транзакция только для чтения - нет).
- Механизм многоверсионности. Основные характеристики: 1. Согласованность по чтению для запросов (Запросы выдают согласованные результаты на момент начала их выполнения. Изменяемые данные помещаются в область сегмента отката). 2. Неблокируемые запросы (Запросы, изменяющие данные, не блокируют запросы, читающие данные, и читающие запросы не блокируют изменяющие, как это бывает в других СУБД).
- Операторы управления транзакциями: SET TRANSACTION, COMMIT, ROLLBACK, SAVEPOINT.
Оператор COMMIT завершает транзакцию и делает любые выполненные в ней изменения постоянными.
ROLLBACK. Простой оператор отката завершает транзакцию и отменяет все выполненные в ней и незафиксированные изменения.
Оператор SAVEPOINT позволяет создать в транзакции "метку", или точку сохранения.
SET TRANSACTION. Позволяет устанавливать атрибуты транзакции, такие как уровень изолированности и то, будет ли она использоваться только для чтения данных или для чтения и записи.
Автономные транзакции позволяют создать "транзакцию внутри транзакции", которая зафиксирует или выполнит откат изменений, независимо от родительской транзакции.
Автономные транзакции предоставляют новый метод управления транзакциями в PL/SQL и могут быть использованы в следующих конструкциях:
- Анонимные блоки верхнего уровня.
- Локальные (процедура в процедуре).
- Методы объектных типов.
- Триггеры баз данных.
Пример.
tkyte@TKYTE816> create table t (msg varchar2(25));
Table created.
tkyte@TKYTE816> create or replace procedure Autonomous_Insert
2 as
3 pragma autonomous_transaction;
4 begin
5 insert into t values ('Autonomous Insert');
6 commit;
7 end;
8 /
Procedure created.
tkyte@TKYTE816> create or replace procedure NonAutonomous_Insert
2 as
3 begin
4 insert into t values ('NonAutonomous Insert');
5 commit;
6 end;
7 /
Procedure created.
Процедуры вставляют свои имена в таблицу сообщений и фиксируют результат. PRAGMA AUTONOMOUS_TRANSACTION - указывает, что процедура выполнятся как новая автономная транзакция, независимо от родительской. Рассмотрим поведение обычной транзакции в анонимном блоке PL/SQL:
tkyte@TKYTE816> begin
2 insert into t values ('Anonymous Block');
3 NonAutonomous_Insert;
4 rollback;
5 end;
6 /
PL/SQL procedure successfully completed.
tkyte@TKYTE816> select * from t;
MSG
Anonymous Block
NonAutonomous Insert
Изменения, выполненные анонимным блоком (вставка строки), были зафиксированы процедурой NonAutonomous_Insert. Зафиксированы обе строки данных, и оператору rollback оказалось нечего откатывать. Сравним это с поведением хп, оформленной как автономная транзакция:
tkyte@TKYTE816> delete from t;
2 rows deleted.
tkyte@TKYTE816> commit;
Commit complete.
tkyte@TKYTE816> begin
2 insert into t values ('Anonymous Block');
3 Autonomous_Insert;
4 rollback;
5 end;
6 /
PL/SQL procedure successfully completed.
tkyte@TKYTE816> select * from t;
MSG
Autonomous Insert
Остаются только изменения, выполненные и зафиксированные в автономной транзакции. Оператор INSERT, выполненный в анонимном блоке, откатывается оператором ROLLBACK в строке 4. Оператор COMMIT в процедуре - автономной транзакции не влияет на родительскую транзакцию, начатую в анонимном блоке. Этот простой пример показывает суть автономных транзакций.