解决这个问题是真的一波三折...
昨晚我偶然发现了抛出sql异常没有回滚。
--------------------------------------------关于异常类型的思考方向--------------------------------------------
首先我知道如果单纯只用一个@Transactional 声明事务Spring只会对checked异常和运行时异常进行处理。
根据资料:点击打开链接
得知了尽管sql异常原本并不属于运行时异常或者checked异常,但是经过Spring的重写,所有sql异常都被归类到了运行时异常里。
--------------------------------------------关于连接池配置的思考方向--------------------------------------------
于是乎我调转马头,咨询朋友。其中一个朋友建议我将c3p0的autoCommitOnClose配置设置为false。在尝试后还是宣告失败
--------------------------------------------关于多数据源配置的思考方向--------------------------------------------
由于我目前做的项目是多数据源的,使用了mysql和sqlserver两种数据源。会不会和这方面有关系呢?我便着手查询。
根据资料:点击打开链接
结果发现我的多数据源事务配置还真是行不通的,在3.0之后 Spring便加入了对多数据源动态切换也能正常使用事务的支持。
示例:
<!-- 开启注解式事务扫描 -->
<tx:annotation-driven/>
<bean id="transactionManager1" class="org.springframework.jdbc.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource1">
<qualifier value="order"/>
</bean>
<bean id="transactionManager2" class="org.springframework.jdbc.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource2">
<qualifier value="account"/>
</bean>
public class TransactionalService {
@Transactional("order")
public void setSomething(String name) { ... }
@Transactional("account")
public void doSomething() { ... }
}
--------------------------------------------关于分布式事务JAT的思考方向--------------------------------------------
很遗憾的是改动过后还是没能成功启动事务,干脆死马当活马医,
我参考多家资料:点击打开链接
再结合自己项目的实际情况成功搭建了分布式的数据源和事务管理器。但是结果仍然是让人失望的,在老板的建议下,我又一路ctrl+z还原了原本的配置。
--------------------------------------------关于SpringMVC配置的思考方向--------------------------------------------
到了这一步,我已经耗费了大约有十个小时的时间了,我终于开始把目光转移到SpringMVC上,终于让我在茫茫百度中找到了这样一份资料 : 点击打开链接
原来当我在Spring+SpringMVC框架下使用注解事务的话,默认情况下spring应该先加载applicationContext.xml,之后再加载springMVC-servlet.xml。那么我的配置就会造成事务失效!
我的原配置(springmvc.xml):
<context:component-scan base-package="com.cmclouds"/>
<mvc:annotation-driven />
现改成
<context:component-scan base-package="com.cmclouds">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
<mvc:annotation-driven />
并且在applicationContext.xml加上
<context:component-scan base-package="com.cmclouds"/>
至此,问题总算得以解决!