繁体   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