Spring 3集成 mybatis3 声明式事务,事务不能回滚后的思考
之前为了练练手自己用spring3 集成 mybaits3,采用spring的声明式事务,发现数据的插入没有问题,但是异常时不能回滚,一开始的代码如下(是按mybatis-spring-1.0.2-reference.pdf):
dao层代码 mybatis 版本的:
bean配置:
事务配置:
service方法:
发现使用上面的代码后数据怎么都插不进去了,看过spring官方文档事务部分,里面的dbcp数据源配置没有这句:。mybatis集成spring的文档也就是强调datasource要和spring事务里面配置的datasource一致,这时候思维就混乱了。
昨天又看着自己的jdbc版本的代码,就想:如果是我用spring的aop来实现事务,我怎么能能在动态生成的代理对象中获取到被代理对象方法里面获取的那个connection对象再去commit和rollback呢?脑袋愚钝,一下子没有想明白。后来就在spring的DataSourceTransactionManager代码里面doCommit方法和doRollBack方法上各打了一个断点,发现不抛异常时执行了doCommit,抛异常时执行了doRollBack。这回可以肯定的是我的配置没有错,也证明我怀疑是对的,spring在代理类中获取的connection和我在dao层代码中获取的不是一个。看了下spring的org.springframework.jdbc.[版本].jar中的类,发现了DataSourceUtils这个类有一个static方法这个配置去掉也行(defaultAutoCommit = true),如果异常,事务会回滚,
再次说明事务不能回滚的原因与此无关
java代码就不用贴了
另外,偶尔发现,mybatis返回的list数据集是通过cglib处理过的,这点表示疑惑。
按理是用cglib或者jdk proxy 生成一个 blogMapper接口对象即可,数据没有必要用
cglib处理。发现过程:gson 这个 java 处理json的框架不认cglib处理过的对象,jackson可以