`

Proxool+hibernate+spring时事务自动回滚导致无法提交的问题解决

    博客分类:
  • Java
阅读更多

这个问题整了我几乎一个下午的时间。。。。。

 

项目需要用到双数据源,而对于连接池,我选择了备受好评的Proxool,结果在spring配置了两个数据源,测试事务的时候,发现不发生错误,数据也无法提交出去。。。。。这让我纳闷了很久很久。。。一直以为是我双数据源配置错了,因为在SSH+proxool的情况下配置双数据源真的是第一次尝试。。。。。

 

后来逐步测试,直到把双数据源配置去了也发现不能插入,于是开始怀疑是数据库的问题。。。结果不是,后来在想,难道proxool的配置被我改烂了?想想也不至于那么差劲吧~~

 

然后重新恢复原始配置,发现proxool的数据源无法插入数据,但是能查询,换成jdbc则都可以,看来这是proxool的问题了。。。找到根源所在,立马对症下药。。。。但是网上也找不到很满意的答案,或者就是不了了之的,而且有这种问题的还真的都是使用proxool数据源的。。。。看来proxool本身存在很多问题啊。。。

 

再测试看看为什么proxool的数据出问题,在proxool和jdbc来回切换间,发现自增长主键的值并不连续的,开始怀疑proxool并不是没有提交查询,而是自动回滚了。。。。,打开SQL事件探测器追踪。。。

果然自动回滚了。。。。。

如下:

SET IMPLICIT_TRANSACTIONS ON
go
declare @P1 int
set @P1=1
exec sp_prepare @P1 output, N'@P0 nvarchar(4000),@P1 nvarchar(4000)', N'insert into testdatabase.dbo.users (name, deptcode) values ( @P0 ,  @P1 ) SELECT SCOPE_IDENTITY() AS ID', 1
select @P1
go
exec sp_execute 1, N'kk', NULL
go
IF @@TRANCOUNT > 0 ROLLBACK TRAN
go
IF @@TRANCOUNT > 0 COMMIT TRAN
SET IMPLICIT_TRANSACTIONS OFF
go

 

这个真是郁闷。。。。proxool这种问题也有阿,有查了下相关的资料,发现很少有人遇到这个问题,只有一个人也说发现了这样的问题,只要使用hibernate加载proxool配置文件就会这样。。。我是使用spring来控制hibernate参数,参数中配置了hibernate加载proxool文件的。。。。。。

 

于是使用了hibernate的参数hibernate.connection.autocommit,设为了true

再测试。。问题居然解决。。。。。至此告一段落。。。虽然proxool的口碑不错,但是配置至今,我发现这家伙的bug还是非常多阿。。。。至今为止已经遇到不少了,而且很多是众所周知的。。。而今天这个也算是一个大bug之一了。。。。

 

写出来也是为了方便遇到相同问题的朋友多一个解决方案,因为我在网上实在没有找到真正能够解决这个问题的方法。。。。

1
0
分享到:
评论
2 楼 weng 2011-06-29  
泪奔啊
纳闷了好久的问题终于解决了     
但还是纳闷,为啥要配置hibernate.connection.autocommit呢,默认不是自动提交了么
还有其它项目中没写这个配置的照样能正常添进去,又是为啥呢?
1 楼 wangking717 2009-09-08  
你用的是Spring的事务,那么提交方面有Spring的事务管理,而不是设置自动提交。你可以做一个测试。你那样做,事务就不起作用了。我也遇到你同样的问题。问题是我现在都还不知道为什么他会出这样的问题,怎么解决都不知道。
我的问题地址:
http://topic.csdn.net/u/20090907/22/b901fd3b-7325-434e-a9eb-8563823519ba.html

相关推荐

Global site tag (gtag.js) - Google Analytics