Một cam kết bên trong một trình kích hoạt sẽ đánh bại định nghĩa cơ bản của giao dịch nguyên tử (xem ACID). Theo định nghĩa logic kích hoạt là một phần mở rộng của hoạt động DML gốc. Do đó, những thay đổi được thực hiện trong các kích hoạt nên được cam kết hoặc khôi phục như một phần của giao dịch mà chúng thực hiện. Vì lý do này, các trình kích hoạt KHÔNG được phép thực thi các câu lệnh CAMIT hoặc ROLLBACK (ngoại trừ các trình kích hoạt tự trị). Dưới đây là một ví dụ về những gì sẽ xảy ra khi họ làm:
SQL> CREATE TABLE tab1 (col1 NUMBER);
Table created.
SQL> CREATE TABLE log (timestamp DATE, operation VARCHAR2(2000));
Table created.
SQL> CREATE TRIGGER tab1_trig
2 AFTER insert ON tab1
3 BEGIN
4 INSERT INTO log VALUES (SYSDATE, 'Insert on TAB1');
5 COMMIT;
6 END;
7 /
Trigger created.
SQL> INSERT INTO tab1 VALUES (1);
INSERT INTO tab1 VALUES (1)
*
ERROR at line 1:
ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "SCOTT.TAB1_TRIG", line 3
ORA-04088: error during execution of trigger 'SCOTT.TAB1_TRIG'
Giao dịch tự trị:
Như cách giải quyết, người ta có thể sử dụng các giao dịch tự trị. Giao dịch tự động thực hiện tách biệt với giao dịch hiện tại.
Không giống như các trình kích hoạt thông thường, các trình kích hoạt tự động có thể chứa các câu lệnh CAMIT và ROLLBACK. Thí dụ:
SQL> CREATE OR REPLACE TRIGGER tab1_trig
2 AFTER insert ON tab1
3 DECLARE
4 PRAGMA AUTONOMOUS_TRANSACTION;
5 BEGIN
6 INSERT INTO log VALUES (SYSDATE, 'Insert on TAB1');
7 COMMIT; -- only allowed in autonomous triggers
8 END;
9 /
Trigger created.
SQL> INSERT INTO tab1 VALUES (1);
1 row created.
Lưu ý rằng với ví dụ trên sẽ chèn và cam kết các mục nhật ký - ngay cả khi giao dịch chính được khôi phục!
Hãy nhớ rằng một thủ tục / hàm / trình kích hoạt "autonomous_transaction" là toàn bộ giao dịch và do đó, nó phải kết thúc bằng một câu lệnh cam kết hoặc quay lại.