Oracle
 sql >> база данни >  >> RDS >> Oracle

НАЧАЛО - КРАЙ блок атомарни транзакции в PL/SQL

Първо, BEGIN..END са просто синтактични елементи и нямат нищо общо с транзакциите.

Второ, в Oracle всички отделни DML изрази са атомарни (т.е. те или успяват напълно, или отменят всички междинни промени при първата грешка) (освен ако не използвате опцията ИЗКЛЮЧЕНИЯ В, която няма да навлизам тук).

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

BEGIN
  SAVEPOINT start_tran;
  INSERT INTO .... ; -- first DML
  UPDATE .... ; -- second DML
  BEGIN ... END; -- some other work
  UPDATE .... ; -- final DML
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK TO start_tran;
    RAISE;
END;

По този начин всяко изключение ще доведе до връщане на операторите в този блок, но всички оператори, които са били изпълнявани преди този блок няма да се връща назад.

Обърнете внимание, че не включвам COMMIT – обикновено предпочитам процеса на извикване, за да издаде комит.

Вярно е, че блок BEGIN..END без манипулатор без изключение автоматично ще се справи с това вместо вас:

BEGIN
  INSERT INTO .... ; -- first DML
  UPDATE .... ; -- second DML
  BEGIN ... END; -- some other work
  UPDATE .... ; -- final DML
END;

Ако бъде повдигнато изключение, всички вмъквания и актуализации ще бъдат върнати назад; но веднага щом искате да добавите манипулатор на изключение, той няма да се върне назад. Затова предпочитам изричния метод, използващ точки за запис.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо Oracle 9i третира празен низ като NULL?

  2. Какво представлява маската за форматиране на дата на Oracle за часови зони?

  3. Как да създадете VARRAY като обект на база данни в базата данни на Oracle

  4. Как да получите тримесечие от дата в Oracle?

  5. Автоматично увеличение за Oracle