`
liangguanhui
  • 浏览: 112893 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

自斟自饮——5. 事务内嵌的关系

阅读更多



今天的主题很简单,有这样一个需求,

-- 这个仅仅是伪代码
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
2
0
分享到:
评论

相关推荐

    构建微服务云原生应用——介绍.pdf

    该文件标题为“构建微服务云原生应用——介绍.pdf”,顾名思义,该文档涉及的主题和知识点围绕微服务架构、云原生应用以及与之相关的开发、运维实践。 **微服务架构**: 微服务架构是一种设计方法,它将一个复杂的...

    android webview加载网页获取对应url 参数值的方法(csdn)————程序.pdf

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容,提供类似于浏览器的体验。本文将详细讲解如何在Android的WebView中加载网页,并获取URL参数值的方法。 首先,我们要明白...

    python 函数也可以是一个对象,可以存放在列表中并调用(csdn)————程序.pdf

    5. **动态绑定**:由于函数是对象,我们可以根据运行时的情况动态决定调用哪个函数,增强了代码的可扩展性。 了解并熟练运用这些概念,可以让你编写出更加灵活和高效的Python代码。函数对象的概念是Python面向对象...

    Python中的“酿造台”——函数.zip

    当一个内嵌函数引用了其外部函数的局部变量,并且外部函数已经返回时,就形成了闭包。闭包可以用来实现数据隐藏和延迟计算。 七、高阶函数 1. 接受一个或多个函数作为参数的函数称为高阶函数,如`map()`、`filter()...

    暨大学子的毕业设计——基于vue和springboot的光电论坛网站,前后端分离——后端.zip

    本项目——"暨大学子的毕业设计",正是以此为基础,构建了一个基于Vue.js和SpringBoot的光电论坛网站。这个设计不仅展现了学生对现代Web开发技术的掌握,也为我们提供了一次深入学习和实践的机会。 首先,让我们...

    网页模板——TweenMax.js+SVG 实现的直升机起飞降落动画效果源码.zip

    在HTML5中,SVG可以直接内嵌到网页中,提供丰富的图形绘制和动画能力。在这个模板中,SVG用于绘制直升机的图形,因为其矢量特性,使得无论放大或缩小,图形都能保持清晰无损。 实现直升机动画的关键步骤可能包括...

    jdbc——内嵌事务

    jdbc——内嵌事务 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> <bean id="departmentDao" class="my.aop.dao....

    ARM汇编语言与嵌入式C语言混合编程————内嵌汇编[归纳].pdf

    ARM汇编语言与嵌入式C语言混合编程————内嵌汇编[归纳].pdf

    司法项目检索系统——毕业设计.zip

    在这个“司法项目检索系统——毕业设计.zip”压缩包中,包含了一个名为"Law-master"的项目源码,这表明这是一个基于Java后端技术开发的法律检索系统。 首先,我们要了解Java后端开发的基础。Java是一种广泛使用的...

    HTML网页练习——努比亚官网.rar

    "HTML网页练习——努比亚官网.rar"这个压缩包文件提供了一个很好的学习平台,特别适合初学者了解和掌握HTML5的基础知识。 首先,HTML(HyperText Markup Language)是一种标记语言,用于描述网页内容和结构。HTML5...

    Unity内嵌浏览器.zip

    而`unity内嵌浏览器——UniWebView插件 - 简书_files`很可能是该网页的关联文件,如图片、CSS样式表等,以辅助理解教程内容。 六、使用流程 1. 导入插件:将`uniwebview_2_9_1.unitypackage`导入Unity项目。 2. ...

    java开发简历范本——有经验.docx

    【Java 开发简历范本——有经验】 在Java开发领域,一份详尽的简历是向潜在雇主展示技术能力和项目经验的重要途径。以下是一份典型的Java开发者简历中的关键知识点: 1. **基础技能**: - **Java编程**:熟练掌握...

    安卓Android源码——TabHost内嵌ActivityGroup界面管理源码.zip

    本资源“安卓Android源码——TabHost内嵌ActivityGroup界面管理源码.zip”提供了一个实例,帮助开发者理解如何在TabHost中嵌入ActivityGroup来实现复杂的界面管理。 TabHost是Android SDK提供的一种用于创建多标签...

    Eclipse权威开发指南2.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...

    高校社交系统——技术论坛.zip

    《高校社交系统——技术论坛》是一个基于Java技术的毕业设计项目,主要采用了SpringBoot框架进行后端开发,并结合Layui前端框架构建用户界面。这个系统旨在为高校学生提供一个交流技术、分享知识的在线平台。 一、...

    网页模板——jQuery内嵌iframe导航菜单特效源码.zip

    这个名为"jQuery内嵌iframe导航菜单特效源码.zip"的压缩包文件提供了一个使用jQuery实现的内嵌iframe的导航菜单特效源代码,旨在帮助开发者创建动态、交互性强的网页界面。 首先,我们来理解一下jQuery。jQuery是一...

    山大电力WDGL-VI技术介绍——浙江0804.pptx

    WDGL系列录波装置自1990年代初开始研发,经历了从WDGL-I到WDGL-V的不同阶段,逐步提升处理器性能、采样频率、模拟通道数量和数据记录能力。WDGL-VI作为新一代产品,具备了以下特点: 1. 内嵌GPS对时同步采样技术:...

    Android源码——TabHost内嵌ActivityGroup界面管理源码_new_17.zip

    本资源“Android源码——TabHost内嵌ActivityGroup界面管理源码_new_17.zip”提供了一种实现复杂界面布局的方式,下面将详细解释这两个组件以及它们在源码中的应用。 首先,TabHost是Android提供的一个用于创建带有...

    1.使用D语言快速构建高性能服务端 —— 邹佳庆.pdf

    * 内嵌汇编:D 语言支持内嵌汇编,提供了底层的控制能力。 D 语言在服务端开发中的应用 D 语言非常适合服务端开发,提供了高性能、简洁的语法特性,满足了服务端应用的需求。在服务端开发中,D 语言可以用于构建高...

    Eclipse权威开发指南3.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中运行多窗口和多...

Global site tag (gtag.js) - Google Analytics