簡體   English   中英

事務注釋未按預期工作

[英]Transactional annotation not working as expected

我在@Transactional 中回滾時遇到問題。 當調用回滾時,回滾本身正在工作,但執行了另一個方法。

@Transactional(rollbackFor = { Exception.class })
@Service
public class Service {

    public void method1() {
        stuffToGetListOfObjects();
        deleteAllAndSaveAll(listOfObejcts);
        Util.staticMethod();
    }

    private deleteAllAndSaveAll(List list) {
        repository.deleteAll();
        repository.saveAll(list);
    }
}
@SpringBootApplication
public class Application implements ApplicationRunner {

    private final Service service;

    @Autowired
    public Application(Service service) {
        this.service = service;
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        service.method1();
    }
}

當在 repository.saveAll(list) 中插入過程中出現問題時,實際上並沒有刪除任何數據,這是正常的和預期的。 問題是程序正在運行 Util.staticMethod() 方法在“回滾后”執行。 我知道 static 方法不能是 @Transactional 並且私有方法被忽略,但這似乎不是問題。 根據日志,method1() 中的所有內容都先執行,然后執行插入。 我想我需要以某種方式從事務中挑選出 Util.staticMethod() 調用。

這就是為什么您應該將存儲庫操作與服務功能分開。 存儲庫操作被回滾。 如果將它們分開,存儲庫級別將引發錯誤並自行回滾。 而在static方法之前,可以通過@transactionaleventlistener查看事務是否完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM