zoukankan      html  css  js  c++  java
  • 存储过程中控制事务带来的问题

       近期碰到一个诡异的问题,功能完毕,结果又部分表内容更新,部分表内容没有更新。程序也没有报错。

       简单说下架构,spring + hibernate + mybatits + oracle, 中间件是weblogic 。前端页面 --> facade --> appservice --> mybatits,  模块之间的调用通过SOA。事务加在facade层,appsercie层写业务。

       一个功能须要更新若干张表,不同模块的表,逻辑大致例如以下:

       update A模块的 a1表。a2表

       delete B模块的 b1表,b2表。b3b4表。b5

       update C模块的 c1表

       .......

       这个功能在模块A中操作。操作B、C模块是通过SOA。结果是A、B模块的表没有更新,操作模块C及下面的都成功了。操作这些表的方法在facade中,理论上,这些操作都是在一个事务中。这些事务的提交,回滚都是weblogic容器控制。

       做了非常多尝试,在数据库中v$sql找update A的sql是否有运行。发现运行了,把hibernate show_sql功能打开,确认sql已经运行。

       仅仅有一行行代码走查了。发现更新模块B的代码因为删除较复杂,用存储过程写的,存储过程有捕获异常。异常处理是rollback。一切都明了了。就是这个rollback产生的问题。

    在一个事务中,因为存储过程删除报错。异常没有抛出,而是rollback,回滚了之前的操作,所以出现部分没有更新,部分有更新。

       结论:假设功能有java代码和存储过程,那事务就所有交给java处理,假设部分事务交给存储过程处理,那就会出现上述问题。

    那存储过程能不能控制事务,能,当用oracle job调用存储时就能够。

  • 相关阅读:
    多种方式实现数组的扁平化处理
    利用node中的内置模块fs实现对简单文件的读取 拷贝 创建等功能
    浅谈es5和es6中的继承
    js之冒泡排序与快速排序
    IE5,IE6,IE7,IE8的css兼容性列表[转自MSDN]
    css3 动画
    各种浏览器css hack
    解决li在ie,firefox中行高不一致问题
    Css:背景色透明,内容不透明之终极方法!兼容所有浏览器
    png-24在ie6中的几种透明方法
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7239850.html
Copyright © 2011-2022 走看看