首先,有2个问题。
1.怎么解决把日志写入表的问题
不要以为直接insert一下就好了,因为假设事务失败了,日志表的DML操作也会回滚,这样,在排错时,日志就没有卵用了。
之前做过一个项目,可以把写日志的处理单独开一个session,这样就可以隔离业务处理和日志处理了。这个算是一个解决方案,缺点就是占用数据库连接。
2.触发器中怎么写入commit,rollback
这个问题貌似就麻烦了,因为触发器中不能写这种语句。
另一种解决方案就是自治事务。
自治事务就是独立于主事务,自己控制的分支事务,实现方式超级简单,在PL/SQL代码中加入PRAGMA AUTONOMOUS_TRANSACTION就可以了,不多说,上案例。
1.存储过程加自治事务
CREATE OR REPLACE PROCEDURE WRITE_LOG(LOGCONTENT VARCHAR)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO TAB_LOG (COMN) VALUES (LOGCONTENT);
COMMIT;
END;
BEGIN
UPDATE EMP SET DEPTNO=99 WHERE EMPNO=7788;
COMMIT;
WRITE_LOG('EMP UPDATE SUCCESS.');
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
WRITE_LOG('EMP UPDATE FAIL!!!!');
END;
/
2.触发器加自治事务
CREATE OR REPLACE TRIGGER INSERT_LOG
AFTER INSERT OR UPDATE OR DELETE ON EMP1
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO TAB_LOG (COMN) VALUES ('EMP1 CHANGED!!!!');
COMMIT;
END;
/