Spring嵌套事务失效的问题

直接上代码

	@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方法

你可能感兴趣的:(JVM,Java,SE)