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

最新文章

  1. MySQL动态字符串处理DYNAMIC_STRING
  2. KITTI数据集格式说明
  3. HighChart报表之饼图
  4. C# 如何调用WebServer函数
  5. 状态压缩 CSU1129 送货到家
  6. 【leetcode】Maximum Gap
  7. PHPExcel创建文件格式写入对象实例
  8. July 15th, Week 29th Friday, 2016
  9. PHP 打印调用函数入口地址(堆栈)
  10. 在Win7下要通过某个 线程 来调用SavaDialog文件选择框的问题
  11. linux下文件编码的查看与修改
  12. SQL语句查找重复记录
  13. miniui datagrid 保存到服务端,使用.NET 自带 JSON 转换时发现日期格式不兼容。
  14. Yii 设置 flash消息 创建一个渐隐形式的消息框
  15. 2015第19周四jquery版本
  16. 四种方法解决DIV高度自适应问题
  17. ClassLoader 工作机制
  18. .NET平台开源项目速览(19)Power BI神器DAX Studio
  19. 网站开发进阶(十七)Html元素隐藏的几种方式
  20. 通信(二):进程间通信之socket

热门文章

  1. Unity使用 16bit 压缩 Texture 颜色能均匀过渡
  2. js禁用&quot;Backspace&quot;键(即禁止网页倒退)
  3. Linux 6.x 下Oracle 11g R2 安装配置
  4. 查询/删除/建立DB2数据表的主键
  5. AC日记——数据流中的算法 51nod 1785
  6. PHP中的stristr(),strstr(),strpos()速度比较
  7. 基于WPF系统框架设计(8)-PasswordBox传值到ViewMode
  8. Vuex 通俗版教程
  9. Copy Records From One Data Block To Another Data Block In Oracle Forms
  10. svm中 C 和sigma对街宽和分隔平面的影响