[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]
分享到:
相关推荐
要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL Server语句都是自治的。
在Oracle数据库中,自治事务可以用于各种场景,例如日志记录、错误处理、统计计算等。自治事务可以提高数据库的性能和可靠性,减少事务的coupling度。 自治事务的优点包括: * 提高事务的独立性和自治性 * 减少...
1. **审计日志**:在触发器中记录事务处理的日志,即使外部事务回滚,日志也不会丢失。 2. **通知机制**:当某些条件满足时,触发器可以独立于外部事务发送电子邮件或短信通知。 3. **数据同步**:在分布式系统中,...
在Oracle中,可以通过`SET TRANSACTION`命令来设置事务的特性,例如,将其设为只读或者指定回滚段。只读事务不允许数据修改操作,而回滚段用于存储回滚信息,以支持事务的回滚操作。例如: ```sql SET TRANSACTION ...
在 Oracle 中,我们可以使用 PRAGMA AUTONOMOUS_TRANSACTION 语句来声明自治事务。 例如,在Proc_SaveBill存储过程中,我们可以使用自治事务来生成单据编号: ```sql CREATE OR REPLACE PROCEDURE Proc_SaveBill AS...
2. 如果需要清理日志文件,可以先复制最近的日志条目到临时文件中,再替换原有的日志文件: ```bash cp /tmp/oracle_temp.log $ORACLE_BASE/admin/orasid/bdump/alert_orasid.log rm /tmp/oracle_temp.log ``` ...
本篇文章将深入探讨如何在Oracle存储过程中使用临时表,包括会话级临时表和事务级临时表。 ### 会话级临时表 会话级临时表(Session-Level Temporary Tables)只在创建它的会话内可见,并且在会话结束时自动删除。...
在Oracle中,你可以使用SaveTransaction方法和Rollback方法的TransactionName参数实现这个功能: ```csharp transaction.Save("SavePoint1"); // Perform operations... if (someCondition) { transaction....
本包用于记录存储过程里面的日志,将日志信息写入日志表(mylog)。可以记录日志时间、过程名称、过程里面记录日志的行数、参数值。如果在异常处理部分记录日志,还可以记录异常代码、异常原因、异常产生的行数。 本人...
Oracle 临时表是 Oracle 数据库中的一种特殊类型的表,它可以保存一个会话或事务中的数据。当会话或事务结束时,临时表中的数据自动清空,但是临时表的结构和元数据还存储在用户的数据字典中。 会话级临时表 会话...
在Oracle中,存储过程使用PL/SQL编写,可以在数据库内部执行,提供高性能和安全性。 ### Oracle事务与存储过程的结合 当在存储过程中使用事务时,可以更精细地控制数据更改的提交或回滚。例如,在给定的部分内容中...
此外,Oracle数据库支持事务的保存点(SAVEPOINT),这是一种在事务中设置的标记,允许在回滚时只回滚到保存点,而不是整个事务。这在需要部分撤销操作但又不想完全回滚事务的情况下非常有用。 总的来说,Oracle在...
在数据库的参数文件中设置参数(一般是在$ORACLE_HOME/dbs/init*.ora文件中):LOG_ARCHIVE_START=LOG_ARCHIVE_DEST=LOG_ARCHIVE_FORMAT=LOG_ARCHIVE_START:如要求自动归档的。 ORACLE归档日志设置是一种重要的...
LogMiner 的工作原理是将日志文件转换为易于理解的格式,然后将转换后的信息记录在 V$LOGMNR_CONTENTS 视图中。LogMiner 还可以使用数据字典来将内部编号转换为原始的对象名称。 Oracle 9i 中 LogMiner 的增强...
在这个例子中,`log_msg`过程使用了`PRAGMA AUTONOMOUS_TRANSACTION`指令,使其成为自治事务,即使主事务失败,日志记录也能成功提交。 #### 结论 事务和锁定是数据库管理中至关重要的概念,它们不仅保证了数据的...
Oracle数据库中的归档日志包含了所有事务处理的更改记录,用于数据库恢复操作。归档日志是在数据库处于归档模式下,当重做日志文件填满并进行切换时生成的。归档日志存储在指定的位置,并且可以根据需要保留一定的...
在Oracle中,事务是一系列逻辑操作的集合,这些操作被视为一个不可分割的整体。当事务开始时,所有相关的操作被记录在事务日志中。如果在事务过程中发生故障,Oracle可以通过事务日志来恢复未完成的事务,确保数据的...
每当一个数据块被修改时,Oracle会把该修改操作记录在一个重做日志条目中,并写入重做日志文件。这些记录包含了修改前的数据和修改后的数据,以及如何进行修改的信息。 #### 三、重做日志的作用 1. **恢复数据库**...
在线重做日志文件的内容完全相同,且保存在不同的位置,用于磁盘日志镜像,以提高安全性。 归档重做日志(Archive Redo Log) 归档重做日志是在线重做日志的存档版本,当在线重做日志文件写满时,Oracle 将其存档...
在本文中,我们将使用 Oracle Linux Server release 6.5 作为操作系统,使用 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 作为日志源库和分析库。我们将使用 nid 工具来修改 DB NAME,以便与日志...