【问题标题】:Java Spring @Transactional prevent concurrencyJava Spring @Transactional 防止并发
【发布时间】: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 中使用一些值吗?

【问题讨论】:

    标签: java spring spring-data-jpa spring-transactions


    【解决方案1】:

    您的问题与@Transactional 行为之间没有直接关系。您遇到的问题是从几个线程调用的经典问题非同步方法,而@Transactional 确保数据库中的所有更改在提交后同时发生。

    最简单的解决方案是使调用这个save(=包装器方法[由于AOP性质,它必须在另一个类中,否则@Transactional不会生效])synchronized。更多信息请见this answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2017-11-22
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多