簡體   English   中英

Java Spring @事務性防止並發

[英]Java Spring @Transactional prevent concurrency

如何防止 Spring 事務中的並發?

情況是兩個請求並行的方法如下:

@Transactional
public save() {
    Optional<Example> result = repository.findById(1);
    if(!result.isPresent()) {
        Example exemple = new Exemple();
        exemple.setParam1(1);
        exemple.setParam2(1);
        exemple.setParam3(1);
        exemple.setParam4(1);
        exemple.setParam5(1);
        exemple.setParam6(1);
        exemple.setParam7(1);
        exemple.setParam8(1);
        repository.save(exemple);
    }
}

因此,例如,第二個請求在第一個請求結束並提交之前通過“ifPresent”驗證。 導致意外行為並保存 object 兩次。

我需要使用@EnableTransactionManagement 嗎? 我需要在@Transactional 中使用一些值嗎?

您的問題與@Transactional行為之間沒有直接關系。 您遇到的問題是從幾個線程調用的經典問題非同步方法,而@Transactional確保數據庫中的所有更改在提交后同時發生。

最簡單的解決方案是使調用save的方法(=包裝器方法[由於AOP性質,它必須在另一個 class 否則@Transactional不會生效]) synchronized 有關更多信息,請參閱此答案

暫無
暫無

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

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