[英]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.