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>

两张方式试了,尤其第二种方式,其他项目都没问题,于是进入了瓶颈。
[color=red][b]问题的解决:
​ ​这两种方式实质都是aop代理(第一种,只是通过注释标签翻译后的aop),而spring的代理方式有两种:1.java动态代理(默认,只能代理接口方式)。2.CGLIB方式代理。
既然没有改过代理方式,那肯定就是java动态代理,而动态代理需要的是接口。
。[/b][/color]
看代码:
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;
}
[color=red][b]
很明显,AsyncInvokeHandlerImpl .java中需要事务的对应都没有接口方法,所以事务无法代理这两个方法,故事务失效。
重新把需要实现的方法实现对应的接口即可。[/b][/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值