网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  在oracle中使用自治事务保存日志表条目     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:95次  录入:管理员--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"优化的三个疑难问题
  相关文档
在存储过程中拥有"role"权限的特殊性 03-17
实例讲解分区表的可用性及相关错误案例 (1) 03-31
直接利用ALTER TABLESPACE修改大文件 04-11
轻松六步使你的Oracle存储过程迅速加密 05-27
讲解oracle数据库的sysdba权限登录问题 (1) 06-05
拨云见日 正确认识password file的作用 (1) 04-24
带你轻松接触多线索机制概念 09-29
个人经验总结:oracle 10g手工创建数据库 08-11
oracle中系统process与session的关系 04-07
如何确定Oracle数据库表中重复的记录 01-15
借助两个开发包在pl/sql中实现多进程通信 06-20
深入分析"oracle"并行处理的技术原理 (1) 02-01
通过db查询的两个数据库间scn会被同步 03-26
将部分数据导出后导入一个统一的数据库中 03-03
重建oracle数据库控制文件的简单方法 05-13
关于Oracle的虚拟专有数据库特性探讨 04-11
解析Oracle的操作系统项目Raw Iron计划 09-01
影响oracle数据库系统性能的初始化参数 11-19
在Oracle9i中Oracle DATA计算时间差 04-23
Oracle与FoxPro两数据库的数据转换 05-13
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息