网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  在oracle中使用自治事务保存日志表条目     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:94次  录入:管理员--2008-02-02  
 

数据库事务是一种单元操作,要么是全部操作都成功,要么全部失败。在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)错误日志表格,您的日志条目仍会在那儿。

 
 
上一篇: 使用"oracle"解析函数快速检查序列间隙    下一篇: 详细讲解有关"cbo"优化的三个疑难问题
  相关文档
在oracle数据库中按用户名重建索引的方法 07-30
有关Oracle数据库的空间管理方法探究 04-11
用utl_inaddr包获取已经连接用户的ip地址 05-29
不影响primary database也可以打开standby 02-28
怎样将"oracle"的外部表汉字转换为拼音 03-07
scn不一致将会导致ora-00600 2662错误 05-30
使用排序哈希簇来加提高询速度 08-05
讲解v$datafile_header相关字段的使用 03-10
oralce定时执行存储过程任务的设置步骤 03-03
解读oracle数据库的统一命名与编码规范 (1) 10-16
讲解sql server定时作业job的设置方法 07-28
详细讲解Oracle中DECODE()函数的使用法 05-27
Oracle数据库SPFILE文件特点及具体操作 06-03
oracle developer 2000中的一些实用语句 08-18
深入讲解"database link"的设置和使用 03-12
深入讲解如何使用rollup配合group by命令 04-09
实例讲解更改oracle数据库中的sys口令 07-30
深入讲解ora-00600 2262错误的解决方法 04-03
详细讲解各种数据库使用jdbc连接的方式 03-28
如何用dbms_rowid获取rowid的详细信息 03-26
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息