坑爹的Spring数据源——自动提交事务

问题描述

项目中涉及充值、扣费逻辑,由于习惯,所以所有的业务逻辑都是通过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)。

以上所述当然是简单叙述,实际过程复杂坎坷,不宜观看。


欢迎访问我的个人博客,寻找更多乐趣~~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
酷客-coidea970开发板用户手册(linux) v1.00坑爹版”问题多多。首先,该版本的用户手册内容混乱,有许多文字错误和排版错误,给用户阅读带来困难。其次,手册中的操作步骤描述不清晰,很难让用户按照指导完成相应的操作。再者,手册中涉及的技术点不够详尽,缺乏实际操作的案例和示范,对用户的学习和使用起不到有效的指导作用。此外,一些重要的功能和配置参数都没有在手册中被提及,导致用户无法充分发挥开发板的性能和功能。最后,该版本的用户手册更新不及时,无法与软件或硬件的最新升级相适应,给用户带来了很大的困扰。 鉴于以上问题,我们建议开发商尽快更新用户手册,修复文字和排版错误,清晰描述操作步骤,详细介绍技术点,并提供丰富的案例和示范。同时,建议手册中加入常见问题解答和故障排除的内容,帮助用户在遇到问题时能够快速定位和解决。另外,建议开发商建立健全的更新机制,及时将软件和硬件升级的信息反馈给用户,确保用户手册的及时性和有效性。 综上所述,“酷客-coidea970开发板用户手册(linux) v1.00坑爹版”的问题令人不满,但我们也相信开发商能够意识到这些问题并尽快采取措施解决。希望在不久的将来,用户能够获得更新完善的用户手册,更好地使用和享受开发板带来的便利和乐趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值