科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Oracle中使用自治事务保存日志表条目

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:changelive 来源:赛迪网技术社区 2007年9月5日

关键字: 数据库 ORACLE 日志

  • 评论
  • 分享微博
  • 分享邮件

数据库事务是一种单元操作,要么是全部操作都成功,要么全部失败。在Oracle中,一个事务是从执行第一个数据管理语言(DML)语句开始,直到执行一个COMMIT语句,提交保存这个事务,或者执行一个ROLLBACK语句,放弃此次操作结束。 O\STzh5/  
'lo<X  
  事务的“要么全部完成,要么什么都没完成”的本性会使将错误信息记入数据库表中变得很困难,因为当事务失败重新运行时,用来编写日志条目的INSERT语句还未完成。 juWnimf  
ZSc pLC  
  针对这种困境,Oracle提供了一种便捷的方法,即自治事务。自治事务从当前事务开始,在其自身的语境中执行。它们能独立地被提交或重新运行,而不影响正在运行的事务。正因为这样,它们成了编写错误日志表格的理想形式。在事务中检测到错误时,您可以在错误日志表格中插入一行并提交它,然后在不丢失这次插入的情况下回滚主事务。 666*U2  
/kKI"x[}[  
  因为自治事务是与主事务相分离的,所以它不能检测到被修改过的行的当前状态。这就好像在主事务提交之前,它们一直处于单独的会话里,对自治事务来说,它们是不可用的。然而,反过来情况就不同了:主事务能够检测到已经执行过的自治事务的结果。 \y;uOPs?)q  
gg-x\$Dvc  
  要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL Server语句都是自治的。 m )2v9k7  
}bX% mp  
  触发无法包含COMMIT语句,除非有PRAGMA AUTONOMOUS_TRANSACTION标记。但是,只有触发中的语句才能被提交,主事务则不行。 gSX`pHJY  
v)V~;jT  
  列表A展示了对一个简单但灵活的错误日志表格所作的CREATE TABLE和CREATE SEQUENCE语句。列表B是一个独立的存储过程,用于更新错误日志表格。该过程接受最多三个数字和三个文本变量,然后将它们和时间戳以及调用过程的用户一起储存在表格中。 列表A: B @&4   
a"!(}I  
CREATE TABLE errorlog ( #Gc #:m  
errorlog_id NUMBER, U3HXHzW&`  
logged_on TIMESTAMP DEFAULT SYSTIMESTAMP, >4n688`(5  
logged_by VARCHAR2(30) DEFAULT USER, gA'ZNNZ,B7  
num1 NUMBER, {a}qhf8(  
num2 NUMBER, !PYC:O,B  
num3 NUMBER, OpqEh]p  
text1 VARCHAR2(1000), qPwg;O4V  
text2 VARCHAR2(1000), UDd-[!>]  
text3 VARCHAR2(1000) 1}hQX0=y  
); MHSF-+JaC  
|e6G^Wl`u  
CREATE SEQUENCE errorlog_seq T9ue.{p  
START WITH 1 K)BtmVK?  
INCREMENT BY 1; p bnL#6y  
5*z; |X#  
Pjd1^"v|  
列表B: A,D;XO  
CREATE OR REPLACE qr5%5 [s  
PROCEDURE log_error ( 1@Ds"_PY  
n1 IN NUMBER:=NULL, t1 IN VARCHAR:=NULL, /o?jO7c<  
n2 IN NUMBER:=NULL, t2 IN VARCHAR:=NULL, DHV\^Uc7  
n3 IN NUMBER:=NULL, t3 IN VARCHAR:=NULL `X$?EkW  
) ut#1?9 q  
IS =.8XE`]  
>S-ccx  
PRAGMA AUTONOMOUS_TRANSACTION; `_p$TY\  
 ^5%|2  
BEGIN ~|1"`dLX<  
'^nK    
INSERT INTO errorlog 2:|"B|g&  
(errorlog_id, m@V|x  
num1, num2, num3, text1, text2, text3) t|'> X4X  
VALUES pzv+'=E  
(errorlog_seq.NEXTVAL, n1, n2, n3, t1, t2, t3); ;u{.`rRn  
3SBM?M] 8  
COMMIT; U2I ;D,&  
5N%WyRI  
END; n|9cqb,  
/ ['7LIOcJs,  
L>3nr'Mz  
  要测试这个过程,就要更新(UPDATE)或删除(DELETE)表格中的某些行;这就引发了主事务。然后执行存储过程,将您选择的要记入日志的数据传递给它。最后,重新运行主事务,选择(SELECT)错误日志表格,您的日志条目仍会在那儿。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章