直接上代码
@Transactional
public void methodA() {
try {
methodB();
} catch (Exception e) {
e.printStackTrace();
}
CatalogEntity record = new CatalogEntity();
catalogEntityMapper.insert(record);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
CatalogEntity record = new CatalogEntity();
catalogEntityMapper.insert(record);
if (1 == 1) {
throw new RuntimeException("abc");
}
}
- 上面的代码methodA、B都有声明事务,但是在调用methodB时,是直接调用的目标方法,没有经过AOP代理,所有B的事务是不生效的
- 如果需要B的事务生效,必须使用AOP代理的方式调用methodB,首先开启暴露代理对象,aopContext能够访问@EnableAspectJAutoProxy(exposeProxy=true),然后修改代码:
-
((TestService)AopContext.currentProxy()).methodB();也可以通过BeanFactory里面获取TestService去调用methodB()
-
如果不太理解就自己写JDK动态代码去调用A,B方法

本文详细解析了在Spring框架中如何正确使用事务管理,特别是在涉及多个方法调用时,如何确保事务的一致性和隔离性。文章通过具体代码示例,阐述了在方法A调用方法B时,由于直接调用而非通过AOP代理,导致方法B的事务声明无效的问题。并提供了开启暴露代理对象和使用AOP代理调用方法的解决方案。

700

被折叠的 条评论
为什么被折叠?



