Учебники

19) PL / SQL: фиксация, откат

Что такое TCL-операторы в PL / SQL?

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

COMMIT Сохраняет все ожидающие транзакции
ROLLBACK Отменить все ожидающие транзакции
SAVEPOINT Создает точку в транзакции, до которой откат может быть выполнен позже
Откат к Отменить все ожидающие транзакции до указанной <точки сохранения>

Транзакция будет завершена в следующих сценариях.

  • Когда выдается какое-либо из вышеуказанных утверждений (кроме SAVEPOINT)
  • Когда DDL заявления выпущены. (DDL – операторы автоматической фиксации)
  • КОГДА выдаются заявления DCL. (DCL – операторы автоматической фиксации)

Что такое автономная транзакция

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

Независимо от некоторых модификаций, выполненных во время сеанса, PL / SQL будет рассматривать всю модификацию как одну транзакцию, и сохранение / отмена этой транзакции влияет на все ожидающие изменения в этом сеансе. Автономная транзакция предоставляет разработчику функциональность, позволяющую вносить изменения в отдельную транзакцию и сохранять / отменять эту конкретную транзакцию, не затрагивая основную транзакцию сеанса.

  • Эта автономная транзакция может быть указана на уровне подпрограммы.
  • Чтобы любая подпрограмма работала в другой транзакции, в декларативном разделе этого блока должно быть указано ключевое слово «PRAGMA AUTONOMOUS_TRANSATION».
  • Он даст указание компилятору обрабатывать это как отдельную транзакцию, и сохранение / отбрасывание внутри этого блока не будет отражаться в основной транзакции.
  • Перед тем как выйти из этой автономной транзакции в основную транзакцию, необходимо выполнить COMMIT или ROLLBACK, поскольку в любой момент может быть активна только одна транзакция.
  • Поэтому, как только мы сделали автономную транзакцию, нам нужно сохранить ее и завершить транзакцию, тогда только мы можем вернуться к основной транзакции.

Синтаксис:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • В приведенном выше синтаксисе блок был выполнен как автономная транзакция.

Пример 1. В этом примере мы собираемся понять, как работает автономная транзакция.

SQL в PL / SQL

DECLARE
   l_salary   NUMBER;
   PROCEDURE nested_block IS
   PRAGMA autonomous_transaction;
    BEGIN
     UPDATE emp
       SET
           salary = salary + 15000
       WHERE emp_no = 1002;
   COMMIT;
   END;
BEGIN
   SELECT salary INTO
       l_salary
   FROM emp
   WHERE emp_no = 1001;

   dbms_output.put_line('Before Salary of 1001 is'|| l_salary);
   
   SELECT salary INTO
       l_salary
   FROM emp
   WHERE emp_no = 1002;

   dbms_output.put_line('Before Salary of 1002 is'|| l_salary);    
        
  UPDATE emp
   SET
       salary = salary + 5000
  WHERE emp_no = 1001;

  nested_block;

  ROLLBACK;

 SELECT salary 
 INTO  l_salary
 FROM emp
 WHERE emp_no = 1001;

 dbms_output.put_line('After Salary of 1001 is'|| l_salary);

 SELECT salary INTO
   l_salary
 FROM emp
 WHERE emp_no = 1002;

 dbms_output.put_line('After Salary of 1002 is '|| l_salary);

end;

Вывод

Before:Salary of 1001 is 15000 
Before:Salary of 1002 is 10000 
After:Salary of 1001 is 15000 
After:Salary of 1002 is 25000

Объяснение кода:

  • Строка кода 2 : объявление l_salary как NUMBER.
  • Строка кода 3 : объявление процедуры nested_block
  • Строка кода 4 : Создание процедуры nested_block как «AUTONOMOUS_TRANSACTION».
  • Строка кода 7-9: увеличение зарплаты сотруднику с номером 1002 на 15000.
  • Строка кода 10: фиксация транзакции.
  • Строка кода 13-16: печать сведений о зарплате сотрудника 1001 и 1002 до внесения изменений.
  • Строка кода 17-19: повышение зарплаты сотруднику № 1001 на 5000.
  • Строка кода 20: вызов процедуры nested_block;
  • Строка кода 21: отмена основной транзакции.
  • Строка кода 22-25: печать сведений о зарплате сотрудника 1001 и 1002 после изменений.
  • Увеличение заработной платы сотрудника с номером 1001 не отражается, поскольку основная транзакция была отклонена. Увеличение заработной платы сотрудника с номером 1002 отражено, поскольку этот блок был выполнен как отдельная транзакция и сохранен в конце.
  • Таким образом, независимо от сохранения / сброса в основной транзакции, изменения в автономной транзакции были сохранены без изменения основных транзакций.