博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Data JPA 事务锁
阅读量:7101 次
发布时间:2019-06-28

本文共 1662 字,大约阅读时间需要 5 分钟。

1.概述

在本快速教程中,我们将讨论在Spring Data JPA中为和预定义存储库的CRUD方法启用事务锁, 我们还将查看不同的锁类型并设置事务锁超时。

2.锁类型

JPA定义了两种主要的锁类型,即悲观锁和乐观锁。

2.1悲观锁

当我们在事务中使用悲观锁并访问实体时,它将立即锁定。通过提交或回滚事务来释放锁。

2.2乐观锁

**在乐观中,事务不会立即锁定实体。**相反,事务通常会保存实体的状态,并为其分配版本号。

当我们尝试在不同的事务中更新实体的状态时,事务会在更新期间将保存的版本号与现有的版本号进行比较。

此时,如果版本号不同,则表示无法修改实体。如果存在活动事务,那么该事务将被回滚,并且底层JPA实现将抛出OptimisticLockException

除版本号方法外,我们还可以使用其他方法,如时间戳,哈希值计算或序列化校验和,具体取决于哪种方法最适合我们当前的开发环境。

3.在查询方法上启用事务锁

要获取实体的锁定,我们可以通过使用@Lock来注解目标查询方法, 并传递所需的锁定模式类型

是锁定实体时要指定的枚举值。然后,将指定的锁定模式传递到数据库,以在实体对象上应用相应的锁定。

要在Spring Data JPA存储库的自定义查询方法上指定锁定,我们可以使用@Lock注解该方法并指定所需的锁定模式类型:

@Lock(LockModeType.OPTIMISTIC_FORCE_INCREMENT)@Query("SELECT c FROM Customer c WHERE c.orgId = ?1")public List
fetchCustomersByOrgId(Long orgId);复制代码

要强制锁定预定义的存储库方法(如findAll或findById(id)),我们必须在存储库中声明方法并使用@Lock注解该方法:

@Lock(LockModeType.PESSIMISTIC_READ)public Optional
findById(Long customerId);复制代码

当显式启用锁并且没有活动事务时,底层JPA实现将抛出TransactionRequiredException

如果无法授予锁并且锁冲突不会导致事务回滚,则JPA会抛出。但它不标记回滚的活动事务。

4.设置事务锁定超时

使用悲观锁时,数据库将尝试立即锁定实体。当无法立即获取锁定时,底层JPA实现会抛出LockTimeoutException。为避免此类异常,我们可以指定锁超时时间。

在Spring Data JPA中,可以使用[@QueryHints]( /jpa/repository/QueryHints.html)指定锁定超时时间:

@Lock(LockModeType.PESSIMISTIC_READ)@QueryHints({
@QueryHint(name = "javax.persistence.lock.timeout", value = "3000")})public Optional
findById(Long customerId);复制代码

有关在不同范围设置锁定超时提示的更多详细信息,请参见。

5.结论

在本教程中,我们学习了不同类型的事务锁定模式,以及如何在Spring Data JPA中启用事务锁,并简单介绍了如何设置锁定超时。

在正确的位置应用正确的事务锁,可以帮助维护高并发情况下应用程序中数据完整性。

当交易需要严格遵守ACID规则时,我们应该使用悲观锁。当我们需要允许多个并发读取以及在应用程序上下文中可接受的最终一致性时,应该应用乐观锁。

当然,可以在上找到悲观锁和乐观锁的示例代码。

原文:

作者:baeldung

译者:Leesen

转载于:https://juejin.im/post/5cff132d6fb9a07ee566149e

你可能感兴趣的文章
JavaWeb页面增加隐藏版权信息
查看>>
T-SQL学习中--取得部分检索数据记录
查看>>
# 小贼音乐--Swift开发笔记 Step 1
查看>>
【项目管理】低成本提高关键路径成功率
查看>>
使用LUMPY检测结构变异
查看>>
安装Coturn(TURN / STUN服务器)
查看>>
出差第三天
查看>>
度小满获南京银行三年100亿元授信额度,双方并合作共同发力消费金融
查看>>
自动化运维工具Ansible的简单使用
查看>>
at,crontab定时程序
查看>>
zabbix添加端口监控
查看>>
放假前的“例行安检”
查看>>
基本形态学算法
查看>>
PostgreSQL 11 1Kw TPCC , 1亿 TPCB 7*24 强压耐久测试
查看>>
修改toolbar自适应报表宽度
查看>>
Linux基础命令---chkconfig
查看>>
Arista Networks推出400千兆以太网交换机
查看>>
企业网站需要什么样内容才能满足和吸引到用户?
查看>>
关于 Java NIO Buffer 使用的详细解读
查看>>
以太坊系列之十三: evm指令集
查看>>