spring mvc + mybatis事务不起作用

时间:2021-03-07 05:11:48

用spring aop配置了事务,但是不起作用,困扰了好久。

事务配置如下:

<!-- 配置事务管理器,使用jdbc事务 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
        
    <!-- 申明式事务 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
           
            <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
                       
            <tx:method name="*" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:pointcut id="allManagerMethod" expression="execution(* com.xiu.xclk.web.service.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />
    </aop:config>

查网上,有的说是因为spring mvc自动扫描的时候,把包括@service的注解一下都扫描今天了,所以在开始的时候要先排除掉对@service注解的扫描,见帖子:http://www.linuxso.com/architecture/14904.html

配置好之后,事务还是不起作用,很奇怪,之后查找,一个帖子给了很大的启发:http://hi.baidu.com/jakoes/blog/item/7256efc2c7ec30190ff477dc.html,说是Spring的事务实现采用基于AOP的拦截器来实现,如果没有在事务配置的时候注明回滚的checked exception,我的代码中抛的是java.lang.Exception,改成抛RuntimeException,事务起作用了。帖子中说两种办法可以解决:

1,在事务属性后面加上需要回滚的checked exception。比如<prop key="save*">PROPAGATION_REQUIRED,-XXXXException</prop>(注意那个"-",对应的是"+")

2, 不改配置文件,将需要事务回滚的异常继承自 unchecked exception 类,也就是 RuntimeException

那么对于第二种方法,我的是起作用了,但是第一种方法我的是声明了对Exception回滚了啊。后来一想,是不是要写全java类名啊,于是改成:

<tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>,这样就起作用了。看来还是自己大意了,spring的配置文件要写全类名的。