spring事务无法生效问题

问题描述:
第一种方式:

使用注释@Transactional 方式,网上查配置找不到问题,但就是不生效,于是换成第二种配置aop的方式
    <context:annotation-config />
    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

第二种方式
这种方式其他项目用过没有问题,但是我这……

    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <tx:advice id="advice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="query*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="batchSave*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="exe*" propagation="REQUIRED"/>
            <tx:method name="*" propagation="SUPPORTS" read-only="true" />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="trManagers" expression="execution(* com.test.core.task.impl.*.*(..)) "/>
        <aop:advisor id="txAdviceAop" advice-ref="advice" pointcut-ref="trManagers"/>
    </aop:config>

两张方式试了,尤其第二种方式,其他项目都没问题,于是进入了瓶颈。
问题的解决:
    ​    ​这两种方式实质都是aop代理(第一种,只是通过注释标签翻译后的aop),而spring的代理方式有两种:1.java动态代理(默认,只能代理接口方式)。2.CGLIB方式代理。
既然没有改过代理方式,那肯定就是java动态代理,而动态代理需要的是接口。

看代码:
AsyncInvokeHandlerImpl .java代码如下
public class AsyncInvokeHandlerImpl implements InvokeHandler {

//此为InvokeHandler 接口的方法
    public String execute(HttpServletRequest request) throws Exception {
//......
}
//需要事务的方法
public void exe(HttpServletRequest request){
}
//需要事务的方法
public boolean insertTask(Task task){
}

InvokeHandler .java(接口)代码:
public interface InvokeHandler {
<T> String execute(HttpServletRequest request) throws Exception;
}

很明显,AsyncInvokeHandlerImpl .java中需要事务的对应都没有接口方法,所以事务无法代理这两个方法,故事务失效。
重新把需要实现的方法实现对应的接口即可。

猜你喜欢

转载自zhx870127-hotmail-com.iteye.com/blog/2105944