Spring / JPA多线程死锁

时间:2018-03-15 16:54:31

标签: java spring multithreading jpa spring-boot

我有一个依赖于spring-boot-starter-data-jpa的spring-boot应用程序。我有一个这样的简单存储库:

import org.springframework.data.jpa.repository.JpaRepository;

public interface FooRepository extends JpaRepository<FooEntity, Integer> {
}

我有一个像这样的简单控制器:

@RestController
public class FooController {
    private FooRepository fooRepo;

    public FooController(final FooRepository fooRepo) {
        this.fooRepo = fooRepo;
    }

    @GetMapping(value = "{id}}", produces = "application/json")
    public ResponseEntity<FooEntity> getFoo(@PathVariable("id") int fooId) {
        FooEntity ent = fooRepo.findOne(fooId);
        return new ResponseEntity<>(ent, HttpStatus.OK);
    }
}

但是我的应用程序一直遇到死锁问题。即使有10个用户同时尝试获取Foo也会导致错误:

Transaction was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

什么是使应用程序线程中的所有数据库事务安全的最佳方法?

编辑1:这不仅适用于获取,还适用于保存和更新。该问题的一个解决方案是将Java关键字synchronized添加到存储库方法。这解决了所有死锁问题,而不再担心。但这是否意味着我们必须将该关键字添加到每个repo方法中?有更可持续的解决方案吗?

0 个答案:

没有答案