我有一个依赖于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方法中?有更可持续的解决方案吗?