坑爹的Spring数据源——自动提交事务
来源:互联网 发布:freebsd如何安装软件 编辑:程序博客网 时间:2024/06/07 04:42
问题描述
项目中涉及充值、扣费逻辑,由于习惯,所以所有的业务逻辑都是通过Mysql存储过程来控制的,所以很自然的将Mysql设置为手动提交(全局的),然后存储过程中根据返回码决定是提交还是回滚。但是今天出现一个存储过程返回错误码,但是部分事务提交了,研究了半天,发现并没有任务问题,手动调用存储过程是返回错误码,但是不会部分提交事务。于是决定找下问题,不找不知道,一找吓一跳。
(先说明下,项目未使用Spring的事务管理,而是通过存储过程手动控制事务,所以此处与Spring的事务管理无任何关系。)
由于经过测试排除了数据库层面的问题,那么问题只能出现在程序层了。
问题发现
项目使用的Spring配置的JBoss的JNDI数据源,JBoss也比较老(是很老),通过使用Spring执行select @@autocommit;发现autocommit竟然是1(自动提交事务),但是明明已经在数据库层将autocommit设置为0(手动提交事务)了,很显然Connection中主动设置了当前会话的autocommit。
问题深究
由于Connection来自DataSource,而Spring中对Connection并未做任何的封装,同时通过Debug发现Spring获得的Connection是org.jboss.resource.adapter.jdbc.WrappedConnection类,看来是JBoss的JNDI数据源的Connection没错了。没找到源码,所以只好用jd反编辑查看了,发现里面有个jdbcAutoCommit,默认是true,WrappedConnection是实现java.sql.Connection的,所以提供了setAutoCommit(),但是由于能力有限无法找到JBoss初始化JNDI数据源的代码,也没找到任何可配置该参数的地方,所以没整了。
问题解决
既然写这篇文章,总归有个解决方案,不管好还是不好,总不能留着打自己脸呀。
解决方案就是发现JBoss配置数据源时有一个参数:new-connection-sql,通过注释发现该参数是在每次创建一个新的Connection时调用的,目的可能是用来测试或者其他的,有了这个参数我们就可以在所有通过该Connection的请求之前设置当前Connection的autoCommit=0,所以这个参数的值设置为set autocommit=0就可以解决啦。
同时发现有些数据源页不提供自动提交事务配置,默认还都是true(不知道是自己没找对还是真的没有,如C3P0)。
以上所述当然是简单叙述,实际过程复杂坎坷,不宜观看。
欢迎访问我的个人博客,寻找更多乐趣~~~
- 坑爹的Spring数据源——自动提交事务
- Spring事务 之 事务自动提交
- Spring Hibernate 单元测试配置为事务自动回滚时需要提交事务时的处理
- Spring的自动扫描、数据源配置、AOP和事务等配置
- Spring事务之七(事务自动提交)
- Spring与Hibernate的整合,不配置事务管理器,事务会自动提交(Hibernate默认手动提交)
- Spring技术内幕——事务的创建,挂起,回归,提交(事务拦截器和抽象事务管理器)
- mysql的事务的自动提交
- Hibernate——ThreadLocal模式下管理的Session会在事务提交后自动关闭
- spring无事务的数据源切换,和带事务的数据源切换
- 自动提交事务
- 自动提交 与 事务
- 关于spring事务提交的随笔
- Spring如何设置让事务自动提交和回滚?Spring两种事务管理方式的配置及使用
- Spring数据源自动配置
- spring事务提交问题
- Spring 手动提交事务
- spring动态数据源和事务配合的调研
- nmap
- 字符编码笔记:ASCII,Unicode和UTF-8
- Cglib类代理工厂
- 将URL中的中文转化成url格式
- iOS面试题集锦
- 坑爹的Spring数据源——自动提交事务
- 3G Remote Alarm Camera
- 初识backbone之HelloWord
- 2 BLE介绍
- 03(maven+SSH)网上商城项目实战之数据库设计(PDM)
- iso9660重新回顾
- Windows 系统错误193: 0xc1
- SQl语句收藏
- 相机权限