java @Transactional 注解類內部調用不回滾問題解決
今天幫同事看一個問題,關于事務在同一個類中,一個方法調用另一個方法 事務不回滾問題,這問題以前也遇到過,不過這次是在springboot項目中來解決,現(xiàn)在直接把方法寫出來。
1. POM文件引入 如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
2. 在springboot啟動類上,添加注解,如下:
package com.szl; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.EnableAspectJAutoProxy; @EnableAspectJAutoProxy(exposeProxy = true) @SpringBootApplication public class DemoSzlApplication { public static void main(String[] args) { SpringApplication.run(DemoSzlApplication.class, args); } }
3. 主要實現(xiàn)類,如下:
package com.szl.service.impl; import com.szl.mapper.DemoSzlMapper; import com.szl.mapper.entity.DemoSzl; import com.szl.service.DemoSzlService; import org.springframework.aop.framework.AopContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.beans.Transient; import java.util.Date; @Service("demoSzlService") public class DemoSzlServiceImpl implements DemoSzlService { @Autowired private DemoSzlMapper demoSzlMapper; @Override @Transactional public void saveTest1() { DemoSzl ds1 = new DemoSzl("szl001", new Date()); demoSzlMapper.insert(ds1); try {
// 此處如果方法執(zhí)行失敗,就可以回滾成功。 ((DemoSzlServiceImpl) AopContext.currentProxy()).saveTest2(); } catch (Exception e) { e.printStackTrace(); } } @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public void saveTest2() { try { DemoSzl ds2 = new DemoSzl("szl002", new Date()); demoSzlMapper.insert(ds2); int t = 1 / 0; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("錯誤"); } } }
OK, 記錄完畢,以上本人親測已驗證。

浙公網安備 33010602011771號