Java Spring @Transactional 防止并发
Posted
技术标签:
【中文标题】Java Spring @Transactional 防止并发【英文标题】:Java Spring @Transactional prevent concurrency 【发布时间】:2022-01-12 22:38:17 【问题描述】:如何防止 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”验证。导致意外行为并保存对象两次。
我需要使用@EnableTransactionManagement 吗?我需要在@Transactional 中使用一些值吗?
【问题讨论】:
【参考方案1】:您的问题与@Transactional
行为之间没有直接关系。您遇到的问题是从几个线程调用的经典问题非同步方法,而@Transactional
确保数据库中的所有更改在提交后同时发生。
最简单的解决方案是使调用这个save
(=包装器方法[由于AOP性质,它必须在另一个类中,否则@Transactional
不会生效])synchronized
。更多信息请见this answer。
【讨论】:
以上是关于Java Spring @Transactional 防止并发的主要内容,如果未能解决你的问题,请参考以下文章