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 防止并发的主要内容,如果未能解决你的问题,请参考以下文章

注意Spring事务这一点,避免出现大事务

如何在 Spring 和 Hibernate 中使用两个数据库/数据源

MongoDB4.2分布式事务

oracle rollback 观察时间

重学SpringBoot系列之Mockito测试

区块链之智能合约 solidity踩坑 --上篇