测试代码如下:
抛出异常不回滚,百度无果,只好下载源码调试,开始对spring源码并不清楚,调试的时候也是晕头转向,经过两天的摸索算是有些初步了解. doGetResource每次都为null(见下图),因为null所以每次都会重新从连接池获取链接, 每次从连接池获取链接就不能保证两次获取的链接是同一个,不是同一个链接就不会支持事务回滚. 突破口就是resources.get()获取的map为什么为null, resource在什么地方赋值的. 在bingResource(object key, object value)函数赋值,就在这个函数上打断点,一直这个函数没有被调用, 又陷入死胡同.
接着回忆一下在spring框架使用中踩过的坑,有一次我把Controller的been配置在了spring-common.xml文件中报404错误,是因为spring的been不能处理spring mvc的事件请求. 于是检查spring-common.xml和spring-mvc.xml,原来我把所有的been全部配置在了spring mvc的配置文件. 是否spring mvc的been不具备事务能力呢? 验证,于是把Controller的been放在spring-mvc.xml文件,其他been全部放在spring-common.xml文件,调试运行进入了TransactionSynchronizationManager.bindResource(Object key, Object value)内的断点, 预感也可了, 一路F8终于回滚了.
得出结论spring mvc实例化的@Service是不具备事务处理能力的.