今天的主题很简单,有这样一个需求,
-- 这个仅仅是伪代码
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
分享到:
相关推荐
这个小和问题的解法可以内嵌在归并排序的实现过程中,是理解和深化归并排序原理的一个关键点。 五、总结 NlogN排序算法是算法学习中的一个重要课题。它不仅涵盖了递归行为和时间复杂度的估算,还涉及到了归并排序...
该文件标题为“构建微服务云原生应用——介绍.pdf”,顾名思义,该文档涉及的主题和知识点围绕微服务架构、云原生应用以及与之相关的开发、运维实践。 **微服务架构**: 微服务架构是一种设计方法,它将一个复杂的...
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容,提供类似于浏览器的体验。本文将详细讲解如何在Android的WebView中加载网页,并获取URL参数值的方法。 首先,我们要明白...
5. **动态绑定**:由于函数是对象,我们可以根据运行时的情况动态决定调用哪个函数,增强了代码的可扩展性。 了解并熟练运用这些概念,可以让你编写出更加灵活和高效的Python代码。函数对象的概念是Python面向对象...
当一个内嵌函数引用了其外部函数的局部变量,并且外部函数已经返回时,就形成了闭包。闭包可以用来实现数据隐藏和延迟计算。 七、高阶函数 1. 接受一个或多个函数作为参数的函数称为高阶函数,如`map()`、`filter()...
本项目——"暨大学子的毕业设计",正是以此为基础,构建了一个基于Vue.js和SpringBoot的光电论坛网站。这个设计不仅展现了学生对现代Web开发技术的掌握,也为我们提供了一次深入学习和实践的机会。 首先,让我们...
在HTML5中,SVG可以直接内嵌到网页中,提供丰富的图形绘制和动画能力。在这个模板中,SVG用于绘制直升机的图形,因为其矢量特性,使得无论放大或缩小,图形都能保持清晰无损。 实现直升机动画的关键步骤可能包括...
jdbc——内嵌事务 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> <bean id="departmentDao" class="my.aop.dao....
ARM汇编语言与嵌入式C语言混合编程————内嵌汇编[归纳].pdf
在这个“司法项目检索系统——毕业设计.zip”压缩包中,包含了一个名为"Law-master"的项目源码,这表明这是一个基于Java后端技术开发的法律检索系统。 首先,我们要了解Java后端开发的基础。Java是一种广泛使用的...
"HTML网页练习——努比亚官网.rar"这个压缩包文件提供了一个很好的学习平台,特别适合初学者了解和掌握HTML5的基础知识。 首先,HTML(HyperText Markup Language)是一种标记语言,用于描述网页内容和结构。HTML5...
而`unity内嵌浏览器——UniWebView插件 - 简书_files`很可能是该网页的关联文件,如图片、CSS样式表等,以辅助理解教程内容。 六、使用流程 1. 导入插件:将`uniwebview_2_9_1.unitypackage`导入Unity项目。 2. ...
【Java 开发简历范本——有经验】 在Java开发领域,一份详尽的简历是向潜在雇主展示技术能力和项目经验的重要途径。以下是一份典型的Java开发者简历中的关键知识点: 1. **基础技能**: - **Java编程**:熟练掌握...
桥梁专门设有供行人使用的通道,内嵌冷暖风系统,确保行人在任何天气条件下都能获得舒适的通行体验。特殊情况下,桥面还能自动升高,为大型船只的通行提供空间。这种创新设计把科技与环保理念完美融合,旨在构建一个...
本资源“安卓Android源码——TabHost内嵌ActivityGroup界面管理源码.zip”提供了一个实例,帮助开发者理解如何在TabHost中嵌入ActivityGroup来实现复杂的界面管理。 TabHost是Android SDK提供的一种用于创建多标签...
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...
《高校社交系统——技术论坛》是一个基于Java技术的毕业设计项目,主要采用了SpringBoot框架进行后端开发,并结合Layui前端框架构建用户界面。这个系统旨在为高校学生提供一个交流技术、分享知识的在线平台。 一、...
这个名为"jQuery内嵌iframe导航菜单特效源码.zip"的压缩包文件提供了一个使用jQuery实现的内嵌iframe的导航菜单特效源代码,旨在帮助开发者创建动态、交互性强的网页界面。 首先,我们来理解一下jQuery。jQuery是一...
WDGL系列录波装置自1990年代初开始研发,经历了从WDGL-I到WDGL-V的不同阶段,逐步提升处理器性能、采样频率、模拟通道数量和数据记录能力。WDGL-VI作为新一代产品,具备了以下特点: 1. 内嵌GPS对时同步采样技术:...
Excel作为一款功能强大的电子表格处理软件,内嵌了丰富的数据分析工具,使得我们能够借助其强大的运算功能和直观的图表系统,高效地完成回归分析任务。本文将通过具体步骤和实例,详细介绍如何利用Excel进行回归分析...