java @Transactional 注解類內部調用不回滾問題解決


今天幫同事看一個問題,關於事務在同一個類中,一個方法調用另一個方法 事務不回滾問題,這問題以前也遇到過,不過這次是在springboot項目中來解決,現在直接把方法寫出來。

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. 主要實現類,如下:

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 {
// 此處如果方法執行失敗,就可以回滾成功。 ((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, 記錄完畢,以上本人親測已驗證。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM