Spring Data JPA 启用事务锁
Spring Data JPA 启用事务锁
点击左上角蓝字,关注“锅外的大佬”
专注分享国外最新技术内容
1.概述
在本快速教程中,我们将讨论在Spring Data JPA中为自定义查询方法和预定义存储库的 CRUD方法启用事务锁, 我们还将查看不同的锁类型并设置事务锁超时。
2.锁类型
JPA定义了两种主要的锁类型,即悲观锁和乐观锁。
2.1悲观锁
当我们在事务中使用悲观锁并访问实体时,它将立即锁定。通过提交或回滚事务来释放锁。
2.2乐观锁
在乐观中,事务不会立即锁定实体。相反,事务通常会保存实体的状态,并为其分配版本号。
当我们尝试在不同的事务中更新实体的状态时,事务会在更新期间将保存的版本号与现有的版本号进行比较。
此时,如果版本号不同,则表示无法修改实体。如果存在活动事务,那么该事务将被回滚,并且底层JPA实现将抛出OptimisticLockException。
除版本号方法外,我们还可以使用其他方法,如时间戳,哈希值计算或序列化校验和,具体取决于哪种方法最适合我们当前的开发环境。
3.在查询方法上启用事务锁
要获取实体的锁定,我们可以通过使用 @Lock来注解目标查询方法, 并传递所需的锁定模式类型。
锁定模式类型(Lock mode types)是锁定实体时要指定的枚举值。然后,将指定的锁定模式传递到数据库,以在实体对象上应用相应的锁定。
要在Spring Data JPA存储库的自定义查询方法上指定锁定,我们可以使用 @Lock注解该方法并指定所需的锁定模式类型:
@Lock ( LockModeType . OPTIMISTIC_FORCE_INCREMENT ) @Query ( "SELECT c FROM Customer c WHERE c.orgId = ?1" ) public List < Customer > fetchCustomersByOrgId ( Long orgId );
要强制锁定预定义的存储库方法(如findAll或findById(id)),我们必须在存储库中声明方法并使用 @Lock注解该方法:
@Lock ( LockModeType . PESSIMISTIC_READ ) public Optional < Customer > findById ( Long customerId );
当显式启用锁并且没有活动事务时,底层JPA实现将抛出TransactionRequiredException。
如果无法授予锁并且锁冲突不会导致事务回滚,则JPA会抛出LockTimeoutException。但它不标记回滚的活动事务。
4.设置事务锁定超时
使用悲观锁时,数据库将尝试立即锁定实体。当无法立即获取锁定时,底层JPA实现会抛出LockTimeoutException。为避免此类异常,我们可以指定锁超时时间。
在Spring Data JPA中,可以使用@QueryHints指定锁定超时时间:
@Lock ( LockModeType . PESSIMISTIC_READ ) @QueryHints ({ @QueryHint ( name = "javax.persistence.lock.timeout" , value = "3000" )}) public Optional < Customer > findById ( Long customerId );
有关在不同范围设置锁定超时提示的更多详细信息,请参见ObjectDB文章。
5.结论
在本教程中,我们学习了不同类型的事务锁定模式,以及如何在Spring Data JPA中启用事务锁,并简单介绍了如何设置锁定超时。
在正确的位置应用正确的事务锁,可以帮助维护高并发情况下应用程序中数据完整性。
当交易需要严格遵守ACID规则时,我们应该使用悲观锁。当我们需要允许多个并发读取以及在应用程序上下文中可接受的最终一致性时,应该应用乐观锁。
当然,可以在Github上找到悲观锁和乐观锁的示例代码。
原文:https://www.baeldung.com/java-jpa-transaction-locks
作者:baeldung
译者:Leesen
推荐阅读:
快速掌握FileChannel
上篇好文:
如何配置Spring Boot Tomcat
文章对你是否有帮助呢?
别忘记点右上角按钮分享给更多人哦~
- Spring Data JPA加MySql通过@Transactional实现事务处理的两个关键点
- spring boot + spring data jpa + oracle 事务的使用小结
- Spring data jpa 的事务与缓存优化
- Spring Boot 2.0 使用data JPA @Transactional 报错事务不回滚
- spring data jpa 事务控制
- SpringData Jpa、Hibernate、Jpa 三者之间的关系
- spring data jpa初试
- Spring Data JPA之Hello World
- IBatis Mapper&Spring Data JPA实现原理
- Spring Data JPA教程, 第七部分: Pagination(未翻译)
- SpringDataJpa
- 使用 Spring Data JPA 简化 JPA 开发
- SPRING DATA JPA 中几种缓存的配置
- Spring:SpringDataJPA
- SpringBoot入门 (五) 数据库访问之spring data jpa
- Spring data jpa中Query和@Query分别返回map结果集
- Spring Boot + Spring Data JPA项目配置多数据源
- spring data 接口之 JpaRepository,JpaSpecificationExecutor
- 6、关于SpringBoot 和 Spring data jpa 教你玩转Auditing监听事件
- SpringMVC+Spring Data JPA+Shiro+EasyUI简单权限管理系统