今天的主题很简单,有这样一个需求,
-- 这个仅仅是伪代码
begin transaction;
define f_success_cnt = 0
-- 第一个任务
call handle_first_task() returning ret
if ret = true then
f_success_cnt += 1
else
insert into error_log(current, 'first taks is fail')
end if
-- 第二个任务
call handle_second_task() returning ret
if ret = true then
f_success_cnt += 1
else
insert into error_log(current, 'second taks is fail')
end if
-- 第三个任务
call handle_third_task() returning ret
if ret = true then
f_success_cnt += 1
else
insert into error_log(current, 'third taks is fail')
end if
-- 最后要判断是否需要提交
if f_success_cnt >= 2 then
commit transaction
else
insert into error_log(current, 'finally we rollback due to to much errors! ')
rollback transaction
end if
注意,这些都是伪代码,不过我相信你应该看得懂的。简单来说是启动一个事务,然后处理三个任务,最后根据任务完成的个数决定是否commit。
问题的重点是,表error_log,我们可以看到,如果任务失败,会插一些日志到这个表。但是:这个程序最后是有机会commit,也有机会rollback。如果rollback了,之前插入到error_log表的数据也一样会rollback,达不到日志的效果。
对于这种需求,你会有什么solution?
这个问题严格来说不是问题,但,There are a thousand Hamlets in a thousand people's eyes.
首先,最容易想到的解决方案是同时启动两个连接,普通的业务操作用一个连接,另外一个专门用于写日志。这样两个连接就不会存在所谓的事务上的冲突。不过这样就凭空多消耗一个连接,有时候不太划算。不过如果是batch就问题不太大。
其次,你可能会想到一些稀奇古怪的方案,比如写一大堆逻辑判断那些任务,然后再最后再commit或者rollback,然后再插入日志。不过老实说,这种方案已经不是日志了,而且还比较复杂,容易出错。
然后你又可能会想到MySQL的一个很重要特性,多引擎。这里的引擎当然不是飞机的引擎,而是存储引擎,例如MyISAM,InnoDB等。注意这里,MyISAM是不支持事务的,而InnoDB是支持事务,如果混合使用,把事务表配置成MyISAM,即使InnoDB的表发生rollback,也不会影响到MyISAM的表格。这不失为一个好方法。
最后当然是介绍一下今次的主菜——事务自治。这个自治跟我们国家的少数民族事务自治是没有关系的,哈哈。
假如有两个事务A和B,A包含B,那这两个事务的关系一般来说是以下其中一种:
- 嵌套事务(Nested Transaction):指在一个Parent事务中嵌套的一个或多个Sub Transaction.并且主事务与其相互影响,这种事务就称为嵌套事务。以Commit作为事务的结束。
- 自治事务(Autonomous Transaction):指在function,procedure等subprograms中对事务进行自治管理,当在别的pl/sql block里去调用这些subprograms的时候这些subprograms并不随着父pl/sql block的失败而回滚,而是自己管自己commit。以Commit作为事务的结束。自治事务常用于写入LOG或TRAC信息便于查找错误。
这两种事务关系的不同之处在于,嵌套事务中子事务和父事务不是独立的,而在自治事务中父子事务则是独立的。
限于时间关系就不再展开说明了,各位可以google一下,或者到
http://www.iteye.com/wiki/design_think/2297-oracle-transaction 了解一下。
- 大小: 36.9 KB
分享到:
相关推荐
jdbc——内嵌事务 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> <bean id="departmentDao" class="my.aop.dao....
ARM汇编语言与嵌入式C语言混合编程————内嵌汇编[归纳].pdf
C语言嵌入式系统编程修炼之道——背景篇 C语言嵌入式系统编程修炼之道——软件架构篇 1.模块划分 2.多任务还是单任务 3.单任务程序典型架构 4.中断服务程序 5.硬件驱动模块 6.C的面向对象化 总结 C语言嵌入式系统...
安卓Android源码——TabHost内嵌ActivityGroup界面管理源码.zip
网页模板——jQuery内嵌iframe导航菜单特效源码
场景视域下互联网传播的进阶方向——以微信小程序场景内嵌与生态布局为例.pdf
2.3.6 快速差别—— 实时变化通知..... 48 2.3.7 文件编码..... 48 2.3.8 打印..... 49 2.4 Eclipse定制...... 49 2.4.1 透视图..... 49 2.4.2 渐进显示..... 51 2.4.3 在Eclipse中运行多窗口和多工作空间..... 51...
Android源码——TabHost内嵌ActivityGroup界面管理源码_new_17.zip
linux内嵌汇编.docxlinux内嵌汇编.docxlinux内嵌汇编.docx
CANoe.DiVa 作为自动化生成诊断测试用例的工具,原理是基于该工具内部内嵌了基于 UDS 编写的测试用例(几万条),通过加载对应控制器的诊断描述文件(诊断数据库CDD/ODX),与工具中测试用例库 Map,对应生成关于所...
2.3.6 快速差别—— 实时变化通知..... 48 2.3.7 文件编码..... 48 2.3.8 打印..... 49 2.4 Eclipse定制...... 49 2.4.1 透视图..... 49 2.4.2 渐进显示..... 51 2.4.3 在Eclipse中运行多窗口和多...
2.3.6 快速差别—— 实时变化通知..... 48 2.3.7 文件编码..... 48 2.3.8 打印..... 49 2.4 Eclipse定制...... 49 2.4.1 透视图..... 49 2.4.2 渐进显示..... 51 2.4.3 在Eclipse中运行多窗口和多...
完美娱乐在线是完美世界研发的一款基于Internet 团队语音通信平台,功能强大、音质清晰、安全稳定不占资源、适应用户的免费语音软件。为听众提供全新、便捷的收听方式的同时还...3. 修复内嵌端公共频道的抢麦状态异常
Android源码——TabHost内嵌ActivityGroup界面管理源码_new_17.7z
场景视域下互联网传播的进阶方向——以微信小程序场景内嵌与生态布局为例
CefSharp的Browser怎么说也是嵌入了Chromium的浏览器,所以碰到标签“_blank”这样的时候,都是弹出新窗体打开新页面。 但是怎奈我使用了DevExpress控件中的TabForm这个东西来作为主窗体,所以我不希望弹出新的窗体...
Unity苹果安卓平台内嵌浏览器
2 GCC内嵌汇编.............................................................5 2.1 简介.............................................................5 2.2 内嵌汇编举例........................................
Xilium.CefGlue,Xilium.CefGlue.WPF,C#,内嵌浏览器,浏览器内核,浏览器