Java Spring/JPA多线程死锁

Java Spring/JPA多线程死锁,java,spring,multithreading,jpa,spring-boot,Java,Spring,Multithreading,Jpa,Spring Boot,我有一个依赖于springbootstarter数据jpa的springboot应用程序。我有这样一个简单的存储库: import org.springframework.data.jpa.repository.JpaRepository; public interface FooRepository extends JpaRepository<FooEntity, Integer> { } @RestController public class FooController {

我有一个依赖于
springbootstarter数据jpa
的springboot应用程序。我有这样一个简单的存储库:

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);
    }
}
使应用程序中的所有数据库事务线程安全的最佳方法是什么


编辑1:这不仅发生在GET中,还发生在保存和更新中。该问题的一个解决方案是将Java关键字
synchronized
添加到存储库方法中。这解决了所有的死锁问题,不再需要担心。但这是否意味着我们必须在每一种回购方法中添加该关键词?有更可持续的解决方案吗?

像这样的简单选择不会导致任何事务问题。您正在使用哪个数据库?您是否查看了数据库以了解正在执行的查询类型以及采取的锁定类型?@Kayaman-sql-server。这不仅仅是select语句,而这也会导致问题,而且save/update调用非常好,这更有意义。仅凭您显示的代码是不可能出现死锁的。所以,欢迎来到数据库编程的世界。线程安全与此无关,也没有解决所有问题的灵丹妙药。我建议你多阅读。你有没有在application.properties中指定任何连接池属性,以及它是WAR还是JAR和JNDI?@Kayaman阅读什么?我很擅长研究,但我只是想知道我应该寻找和阅读什么
Transaction was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.