如何使用Spring Boot和JPA解决H2上的表锁定问题?

时间:2014-06-17 15:09:23

标签: spring jpa h2 spring-boot

我似乎遇到了一个问题,并且没有真正的解决方法。

我当前的应用程序基于Spring Boot with JPA,以下代码在第二次执行时获取锁定。

@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);
    }

}

1 个答案:

答案 0 :(得分:0)

您应该使用两种技术:

  1. 使用实体中的@Version字段
  2. 来使用乐观锁定
  3. 通过@Transactional注释注释您的方法来添加事务支持。通常,您还必须按@EnableTransactionManagement注释Configuration类,但Spring Boot会为您创建
  4. 那应该可以解决你的问题