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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章