`
小嘴冰凉
  • 浏览: 455807 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在Oracle中使用自治事务保存日志表条目

阅读更多

[size=x-large]

[摘要] 在Oracle中,一个事务是从执行第一个数据管理语言(DML)语句开始,直到执行一个COMMIT语句,提交保存这个事务,或者执行一个ROLLBACK语句,放弃此次操作结束。
[关键字] Oracle 自治事务 保存 日志表   数据库事务是一种单元操作,要么是全部操作都成功,要么全部失败。在Oracle中,一个事务是从执行第一个数据管理语言(DML)语句开始,直到执行一个COMMIT语句,提交保存这个事务,或者执行一个ROLLBACK语句,放弃此次操作结束。 

  事务的“要么全部完成,要么什么都没完成”的本性会使将错误信息记入数据库表中变得很困难,因为当事务失败重新运行时,用来编写日志条目的INSERT语句还未完成。 

  针对这种困境,Oracle提供了一种便捷的方法,即自治事务。自治事务从当前事务开始,在其自身的语境中执行。它们能独立地被提交或重新运行,而不影响正在运行的事务。正因为这样,它们成了编写错误日志表格的理想形式。在事务中检测到错误时,您可以在错误日志表格中插入一行并提交它,然后在不丢失这次插入的情况下回滚主事务。 

  因为自治事务是与主事务相分离的,所以它不能检测到被修改过的行的当前状态。这就好像在主事务提交之前,它们一直处于单独的会话里,对自治事务来说,它们是不可用的。然而,反过来情况就不同了:主事务能够检测到已经执行过的自治事务的结果。 

  要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL Server语句都是自治的。 

  触发无法包含COMMIT语句,除非有PRAGMA AUTONOMOUS_TRANSACTION标记。但是,只有触发中的语句才能被提交,主事务则不行。 

  列表A展示了对一个简单但灵活的错误日志表格所作的CREATE TABLE和CREATE SEQUENCE语句。列表B是一个独立的存储过程,用于更新错误日志表格。该过程接受最多三个数字和三个文本变量,然后将它们和时间戳以及调用过程的用户一起储存在表格中。 列表A: 

  CREATE TABLE errorlog ( 

  errorlog_id NUMBER, 

  logged_on TIMESTAMP DEFAULT SYSTIMESTAMP, 

  logged_by VARCHAR2(30) DEFAULT USER, 

  num1 NUMBER, 

  num2 NUMBER, 

  num3 NUMBER, 

  text1 VARCHAR2(1000), 

  text2 VARCHAR2(1000), 

  text3 VARCHAR2(1000) 

  ); 

  CREATE SEQUENCE errorlog_seq 

  START WITH 1 

  INCREMENT BY 1; 

  列表B: 

  CREATE OR REPLACE 

  PROCEDURE log_error ( 

  n1 IN NUMBER:=NULL, t1 IN VARCHAR:=NULL, 

  n2 IN NUMBER:=NULL, t2 IN VARCHAR:=NULL, 

  n3 IN NUMBER:=NULL, t3 IN VARCHAR:=NULL 

  ) 

  IS 

  PRAGMA AUTONOMOUS_TRANSACTION; 

  BEGIN 

  INSERT INTO errorlog 

  (errorlog_id, 

  num1, num2, num3, text1, text2, text3) 

  VALUES 

  (errorlog_seq.NEXTVAL, n1, n2, n3, t1, t2, t3); 

  COMMIT; 

  END; 

  / 

  要测试这个过程,就要更新(UPDATE)或删除(DELETE)表格中的某些行;这就引发了主事务。然后执行存储过程,将您选择的要记入日志的数据传递给它。最后,重新运行主事务,选择(SELECT)错误日志表格,您的日志条目仍会在那儿


[/size]
分享到:
评论

相关推荐

    Oracle中怎样用自治事务保存日志表

    要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL Server语句都是自治的。

    Oracle自治事务的介绍(Autonomous_Transactions)

    在Oracle数据库中,自治事务可以用于各种场景,例如日志记录、错误处理、统计计算等。自治事务可以提高数据库的性能和可靠性,减少事务的coupling度。 自治事务的优点包括: * 提高事务的独立性和自治性 * 减少...

    oracle自治事务(Trigger)

    1. **审计日志**:在触发器中记录事务处理的日志,即使外部事务回滚,日志也不会丢失。 2. **通知机制**:当某些条件满足时,触发器可以独立于外部事务发送电子邮件或短信通知。 3. **数据同步**:在分布式系统中,...

    在oracle中使用事务

    在Oracle中,可以通过`SET TRANSACTION`命令来设置事务的特性,例如,将其设为只读或者指定回滚段。只读事务不允许数据修改操作,而回滚段用于存储回滚信息,以支持事务的回滚操作。例如: ```sql SET TRANSACTION ...

    Oracle数据完整性嵌套事务调用分析研究

    在 Oracle 中,我们可以使用 PRAGMA AUTONOMOUS_TRANSACTION 语句来声明自治事务。 例如,在Proc_SaveBill存储过程中,我们可以使用自治事务来生成单据编号: ```sql CREATE OR REPLACE PROCEDURE Proc_SaveBill AS...

    oracle数据库日志查看方法

    2. 如果需要清理日志文件,可以先复制最近的日志条目到临时文件中,再替换原有的日志文件: ```bash cp /tmp/oracle_temp.log $ORACLE_BASE/admin/orasid/bdump/alert_orasid.log rm /tmp/oracle_temp.log ``` ...

    Oracle存储过程中使用临时表

    本篇文章将深入探讨如何在Oracle存储过程中使用临时表,包括会话级临时表和事务级临时表。 ### 会话级临时表 会话级临时表(Session-Level Temporary Tables)只在创建它的会话内可见,并且在会话结束时自动删除。...

    在.NET中如何使用Oracle数据库事务

    在Oracle中,你可以使用SaveTransaction方法和Rollback方法的TransactionName参数实现这个功能: ```csharp transaction.Save("SavePoint1"); // Perform operations... if (someCondition) { transaction....

    oracle记录存储过程日志的方法

    本包用于记录存储过程里面的日志,将日志信息写入日志表(mylog)。可以记录日志时间、过程名称、过程里面记录日志的行数、参数值。如果在异常处理部分记录日志,还可以记录异常代码、异常原因、异常产生的行数。 本人...

    oracle日志分析工具LogMiner使用.

    Oracle 日志分析工具 LogMiner 使用 Oracle 日志分析工具 LogMiner 是 Oracle 数据库中的一种功能强大且灵活的日志分析工具,它可以帮助数据库管理员、开发人员和用户快速地对数据库进行日志分析和问题诊断。下面是...

    oracle临时表(事务级、会话级).docx

    Oracle 临时表是 Oracle 数据库中的一种特殊类型的表,它可以保存一个会话或事务中的数据。当会话或事务结束时,临时表中的数据自动清空,但是临时表的结构和元数据还存储在用户的数据字典中。 会话级临时表 会话...

    oracle 事务 回滚 存储过程

    在Oracle中,存储过程使用PL/SQL编写,可以在数据库内部执行,提供高性能和安全性。 ### Oracle事务与存储过程的结合 当在存储过程中使用事务时,可以更精细地控制数据更改的提交或回滚。例如,在给定的部分内容中...

    oracle 在java中的事务处理和异常回滚。

    此外,Oracle数据库支持事务的保存点(SAVEPOINT),这是一种在事务中设置的标记,允许在回滚时只回滚到保存点,而不是整个事务。这在需要部分撤销操作但又不想完全回滚事务的情况下非常有用。 总的来说,Oracle在...

    ORACLE归档日志设置

    在数据库的参数文件中设置参数(一般是在$ORACLE_HOME/dbs/init*.ora文件中):LOG_ARCHIVE_START=LOG_ARCHIVE_DEST=LOG_ARCHIVE_FORMAT=LOG_ARCHIVE_START:如要求自动归档的。 ORACLE归档日志设置是一种重要的...

    深入分析oracle日志文件

    LogMiner 的工作原理是将日志文件转换为易于理解的格式,然后将转换后的信息记录在 V$LOGMNR_CONTENTS 视图中。LogMiner 还可以使用数据字典来将内部编号转换为原始的对象名称。 Oracle 9i 中 LogMiner 的增强...

    事务与锁定的问题 自治事务

    在这个例子中,`log_msg`过程使用了`PRAGMA AUTONOMOUS_TRANSACTION`指令,使其成为自治事务,即使主事务失败,日志记录也能成功提交。 #### 结论 事务和锁定是数据库管理中至关重要的概念,它们不仅保证了数据的...

    Oracle清除归档日志

    Oracle数据库中的归档日志包含了所有事务处理的更改记录,用于数据库恢复操作。归档日志是在数据库处于归档模式下,当重做日志文件填满并进行切换时生成的。归档日志存储在指定的位置,并且可以根据需要保留一定的...

    Oracle基于事务日志的数据恢复.pdf

    在Oracle中,事务是一系列逻辑操作的集合,这些操作被视为一个不可分割的整体。当事务开始时,所有相关的操作被记录在事务日志中。如果在事务过程中发生故障,Oracle可以通过事务日志来恢复未完成的事务,确保数据的...

    oracle重做日志教程

    每当一个数据块被修改时,Oracle会把该修改操作记录在一个重做日志条目中,并写入重做日志文件。这些记录包含了修改前的数据和修改后的数据,以及如何进行修改的信息。 #### 三、重做日志的作用 1. **恢复数据库**...

    Oracle-归档日志详解(运行模式、分类)

    在线重做日志文件的内容完全相同,且保存在不同的位置,用于磁盘日志镜像,以提高安全性。 归档重做日志(Archive Redo Log) 归档重做日志是在线重做日志的存档版本,当在线重做日志文件写满时,Oracle 将其存档...

Global site tag (gtag.js) - Google Analytics