oracle使用自治事务记录系统日志

简介: 在我们对表记录执行DML操作时,一方面,我们需要把错误记录到数据库的日志表中,另一方面,由于错误我们需要回滚核心事务,此时我们可以在记录日志的存储过程中使用自治事务1.

在我们对表记录执行DML操作时,一方面,我们需要把错误记录到数据库的日志表中,另一方面,由于错误我们需要回滚核心事务,此时我们可以在记录日志的存储过程中使用自治事务

1. 定义事务日志表

CREATE TABLE "SCOTT"."EXCEPTION_LOG" 
   (	"ID" NUMBER(18,0), 
	"ERROR_CODE" NUMBER(10,0), 
	"ERROR_MESSAGE" VARCHAR2(2000), 
	"CREATE_TIME" TIMESTAMP (6) DEFAULT Sysdate, //使用系统时间定义日志被创建时间
	"DESCRIPTION" VARCHAR2(500), 
	"EXCEPTION_LEVEL" VARCHAR2(30)
   )


 

2. 定义两个表USERS表各USERS_TEST表,其中业务逻辑为把USERS_TEST表中数据复制到users表中,如果users_test表中username在users中的username列不存在,则把记录插入users表中,如果存在,则把重复记录的日志记录到exception_log表中,如果有其它的异常,则回滚插入记录,但不回滚日志记录

CREATE TABLE "SCOTT"."USERS" 
   (	"USER_ID" NUMBER(10,0) NOT NULL ENABLE, 
	"USERNAME" VARCHAR2(30) NOT NULL ENABLE, 
	"PASSWORD" VARCHAR2(50) NOT NULL ENABLE, 
	 CONSTRAINT "UNIQUE_NAME" UNIQUE ("USERNAME") //定义唯一约束在此列上
)


 

CREATE TABLE "SCOTT"."USERS_TEST" 
   (	"USER_ID" NUMBER(10,0) NOT NULL ENABLE, 
	"USERNAME" VARCHAR2(30) NOT NULL ENABLE, 
	"PASSWORD" VARCHAR2(50) NOT NULL ENABLE
   )

3. 定义记录日志包

CREATE OR REPLACE PACKAGE system_log IS

  PROCEDURE exception_log(ERROR_CODE      IN NUMBER,
                          error_message   IN VARCHAR2,
                          exception_level IN VARCHAR2,
                          description     IN VARCHAR2);

END system_log;


                        

 

CREATE OR REPLACE PACKAGE BODY system_log IS

  PROCEDURE exception_log(ERROR_CODE      IN NUMBER,
                          error_message   IN VARCHAR2,
                          exception_level IN VARCHAR2,
                          description     IN VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION; //声明自治事务
  BEGIN
    INSERT INTO exception_log
      (ERROR_CODE, error_message, exception_level, description)
    VALUES
      (ERROR_CODE, error_message, exception_level, description);
      COMMIT; //提交事务,记得一定要提交,否则会报异常
  EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('can not insert log in exception_log table, error message is:' ||
                           dbms_utility.format_error_backtrace);
  END exception_log;

END system_log;


 

4. 定义转储users_test和users表中的数据

CREATE OR REPLACE PROCEDURE prc_unique_user(id NUMBER) IS
  CURSOR user_cursor IS
    SELECT * FROM users_test WHERE user_id > id;
BEGIN
  FOR uc IN user_cursor
  LOOP
    BEGIN
      INSERT INTO users
        (username, password)
      VALUES
        (uc.username, uc.password);
    EXCEPTION
      WHEN dup_val_on_index THEN
      
        DECLARE
          sql_code NUMBER := SQLCODE;
        BEGIN
          system_log.exception_log(sql_code,
                                   dbms_utility.format_error_stack ||
                                   ', error line:' ||
                                   dbms_utility.format_error_backtrace,
                                   'warn',
                                   '插入重复的username在users表中,username是:' ||
                                   uc.username || ',行号user_id是:' ||
                                   uc.user_id);
        END;
        dbms_output.put_line('插入重复的username在users表中,username是:' ||
                             uc.username || ',行号user_id是:' || uc.user_id);
        ROLLBACK;
    END;
  END LOOP;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    dbms_output.put_line('插入user表中出现了其它异常' ||
                         dbms_utility.format_error_backtrace);
END prc_unique_user;


 

 


 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
Shell Linux C语言
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
【Shell 命令集合 网络通讯 】Linux 查看系统中的UUCP日志文件 uulog命令 使用指南
29 0
|
4月前
|
缓存 关系型数据库 MySQL
MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
47 0
|
4月前
|
存储 缓存 关系型数据库
认真学习MySQL的事务日志-Redo日志
认真学习MySQL的事务日志-Redo日志
44 0
|
4月前
|
监控 Java 数据库
Spring事务相关配置、案例:转账业务追加日志及事务传播行为
Spring事务相关配置、案例:转账业务追加日志及事务传播行为
47 0
|
4月前
|
消息中间件 分布式计算 Kafka
亿万级别Kafka演进之路:可靠性+事务+消息中间件+源码+日志
Kafka起初是由LinkedIn公司采用Scala语言开发的-一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现已被捐献给Apache基金会。目前Kafka已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。
|
6天前
|
运维 Oracle 关系型数据库
Oracle日志文件:数据王国的“记事本”
【4月更文挑战第19天】Oracle日志文件是数据库稳定运行的关键,记录数据变更历史,用于恢复和故障处理。它们协调并发操作,确保数据一致性和完整性。日志文件实时写入操作信息并定期刷新到磁盘,便于数据恢复。然而,日志文件需备份和归档以保证安全性,防止数据丢失。日志文件,数据王国的“记事本”,默默守护数据安全。
|
4月前
|
存储 监控 安全
带你读《Apache Doris 案例集》——07查询平均提速700% ,奇安信基于 Apache Doris 升级日志安全分析系统(1)
带你读《Apache Doris 案例集》——07查询平均提速700% ,奇安信基于 Apache Doris 升级日志安全分析系统(1)
|
4月前
|
SQL 存储 安全
带你读《Apache Doris 案例集》——07查询平均提速700% ,奇安信基于 Apache Doris 升级日志安全分析系统(2)
带你读《Apache Doris 案例集》——07查询平均提速700% ,奇安信基于 Apache Doris 升级日志安全分析系统(2)
110 0
|
7天前
|
JavaScript Java 测试技术
基于Java的公司员工工作日志办公系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的公司员工工作日志办公系统的设计与实现(源码+lw+部署文档+讲解等)
31 3
|
24天前
|
C++
QT实现一个简单的日志打印系统
QT实现一个简单的日志打印系统

推荐镜像

更多