存储过程中控制事务带来的问题
2015-07-29 16:22
417 查看
最近碰到一个诡异的问题,功能完成,结果又部分表内容更新,部分表内容没有更新,程序也没有报错。
简单说下架构,spring + hibernate + mybatits + oracle, 中间件是weblogic 。前端页面 --> facade
--> appservice
--> mybatits, 模块之间的调用通过SOA,事务加在facade层,appsercie层写业务。
一个功能需要更新若干张表,不同模块的表,逻辑大致如下:
update A模块的 a1表,a2表
delete B模块的 b1表,b2表,b3表,b4表,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调用存储时就可以。
简单说下架构,spring + hibernate + mybatits + oracle, 中间件是weblogic 。前端页面 --> facade
--> appservice
--> mybatits, 模块之间的调用通过SOA,事务加在facade层,appsercie层写业务。
一个功能需要更新若干张表,不同模块的表,逻辑大致如下:
update A模块的 a1表,a2表
delete B模块的 b1表,b2表,b3表,b4表,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调用存储时就可以。
相关文章推荐
- linux中send函数MSG_NOSIGNAL异常消息
- HDU 5325 Crazy Bobo(深搜)
- JSON在线API
- 人生思考
- 苹果开发 笔记(54)ZipArchive
- Bootstrap学习--认识Bootstarp
- 关于Node.js的本地应用打包工具node-webkit
- Docker终极指南
- iOS AutoLayout报错包含UIView-Encapsulated-Layout-Width
- 数据库建表需要注意的事
- makefile编写_简单
- Windows多线程同步系列之四-----信号量
- spice图像压缩简介
- VMS Software, Inc.
- 小白学开发(iOS)OC_property和synthesize(2015-07-28)
- EJB学习笔记六(EJB中的拦截器)
- 浅谈Android数据库版本升级及数据的迁移
- linux中解决SSH连接慢问题
- redis常用操作(持续更新)
- 网络流最大流除草计划