【问题标题】:How to solve table locking on H2 using Spring Boot and JPA?如何使用 Spring Boot 和 JPA 解决 H2 上的表锁定问题?
【发布时间】:2014-08-07 16:12:09
【问题描述】:

我似乎遇到了一个问题,但不知道如何解决。

我当前的应用基于带有 JPA 的 Spring Boot,并且以下代码在第二次执行时获得了锁。

@RequestMapping(value="/", method = RequestMethod.GET)
public String index() {
    repository.save(new RawData("test"));
    repository.save(new RawData("test"));

    // hangs when the method index() is run 2 sequentially 
    RawData rawData = rawDataRepository.findOne(1L);
    System.out.println(rawData);

    return "#: " + repository.count();
}

第一次运行时似乎一切正常,但是执行相同的代码 2 次给了我一个锁定:

    RawData rawData = rawDataRepository.findOne(1L);

当方法挂起或等待超时时,尝试连接到数据库也会给我一个锁定超时。

在 Spring Service 中调用相同的代码会导致相同的行为。

@Component
public class SyncService {

    @Autowired
    RawDataRepository rawDataRepository;

    void syncWithRemote() {
        // hang on this line...
        RawData rawData = rawDataRepository.findOne(1L);
        System.out.println(rawData);
    }

}

【问题讨论】:

  • 为什么要从控制器调用存储库方法?首先添加一个服务接口并查看结果。
  • 我原来是这样做的,并且得到了相同的行为。这只是解释问题的测试代码。我也会用服务代码更新代码

标签: spring jpa h2 spring-boot


【解决方案1】:

你应该使用两种技术:

  1. 通过在您的实体中使用 @Version 字段来使用乐观锁定
  2. 通过使用@Transactional 注释来注释您的方法来添加事务支持。通常,您还必须通过 @EnableTransactionManagement 注释配置类,但 Spring Boot 会为您提供

应该可以解决你的问题

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 2020-01-04
    • 2019-11-05
    • 2017-02-03
    • 2019-03-29
    • 2020-01-06
    • 2019-11-17
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多