隐式锁定

在并发理论中,锁定用于保护可变共享数据免受危险数据完整性异常的影响。 因为锁管理是一个非常复杂的问题,所以大多数应用程序都依赖于其数据提供程序隐式锁定技术。

将整个锁定职责委托给数据库系统既可以简化应用程序开发,又可以防止诸如死锁之类的并发问题。 死锁仍然可能发生,但是数据库可以检测并采取安全措施(任意释放两个竞争锁之一)。

物理锁

大多数数据库系统使用共享(读取)排他(写入)锁,这归因于特定的锁定元素(行,表)。 尽管SQL标准要求物理锁定,但是悲观的方法可能会阻碍可伸缩性。

现代数据库已实现了轻量级锁定技术,例如多版本并发控制 。

隐式数据库锁定隐藏在事务隔离级别配置的后面。 每个隔离级别都带有预定义的锁定方案,旨在防止某些数据完整性异常集。

READ COMMITTED对当前事务修改的数据使用查询级共享锁和排他锁。 REPEATABLE READ和SERIALIZABLE在读取时使用事务级共享锁,在写入时使用互斥锁。

逻辑锁

如果数据库锁定足以用于批处理系统,则多请求Web流将跨越多个数据库事务。 对于长时间的对话 ,逻辑(乐观)锁定机制更为合适。

与对话级别的可重复读取存储结合使用 ,乐观锁定可以确保数据完整性,而无需牺牲可伸缩性。

JPA支持开放式锁定和持久性上下文可重复读取,使其非常适合实现逻辑事务。

显式锁定

尽管对于大多数应用程序并发控制要求,隐式锁定可能是最佳选择,但有时您可能需要更细粒度的锁定策略。

大多数数据库系统都支持查询时排他锁定指令,例如SELECT FOR UPDATE或SELECT FOR SHARE 。 因此,我们可以使用较低级别的默认隔离级别(READ COMMITTED),同时为特定事务方案请求共享或排他锁。

大多数乐观锁定实现只验证修改后的数据,但是JPA也允许显式乐观锁定。

JPA锁定

作为数据库抽象层,JPA可以从基础RDBMS提供的隐式锁定机制中受益。 对于逻辑锁定,JPA还提供了可选的自动实体版本控制机制。

JPA支持以下操作的显式锁定:

  • 寻找一个实体
  • 锁定现有的持久性上下文实体
  • 刷新实体
  • 查询通过JPQL,标准或本机查询

显式锁类型

LockModeType包含以下乐观和悲观锁定模式:

锁定模式类型 描述
没有 在没有显式锁定的情况下,应用程序将使用隐式锁定(乐观或悲观)
乐观的 始终在事务提交时发出版本检查,因此确保乐观锁定可重复读取。
与OPTIMISTIC相同。
OPTIMISTIC_FORCE_INCREMENT 始终增加实体版本(即使实体不变),并在事务提交时发出版本检查,从而确保乐观锁定可重复读取。
与OPTIMISTIC_FORCE_INCREMENT相同。
PESSIMISTIC_READ 获取共享锁以防止任何其他事务获取PESSIMISTIC_WRITE锁。
PESSIMISTIC_WRITE 获取排他锁以防止任何其他事务获取PESSIMISTIC_READ或PESSIMISTIC_WRITE锁。
PESSIMISTIC_FORCE_INCREMENT 获取数据库锁以防止任何其他事务获取PESSIMISTIC_READ或PESSIMISTIC_WRITE锁,并且在提交事务时会增加实体版本。

锁定范围和超时

JPA 2.0定义了javax.persistence.lock.scope属性,采用以下值之一:

  • NORMAL由于对象图可以跨越多个表,因此显式的锁定请求可能会传播到多个表(例如,联接继承,辅助表)。由于整个实体关联的行被锁定,因此多对一一对-一对一的外键也将被锁定,但不会锁定另一侧的父级关联。 此范围不会传播到子级集合。
  • 扩展显式锁将传播到元素集合和联结表 ,但不会锁定实际的子实体。 该锁仅在防止幻像读取或更改实际子实体状态的同时,用于防止删除现有子实体时有用。

JPA 2.0还引入了javax.persistence.lock.timeout属性,使我们可以配置在抛出PessimisticLockException之前锁定请求将等待的时间(毫秒)。

休眠锁定

Hibernate支持所有JPA锁定模式和一些其他特定的锁定选项。 与JPA一样,可以为以下操作配置显式锁定:

  • 使用各种LockOptions设置锁定实体。
  • 得到一个实体
  • 加载实体
  • 刷新实体
  • 创建实体或本机查询
  • 创建条件查询

LockModeConverter负责映射JPA和Hibernate锁定模式,如下所示:

休眠锁定模式 JPA LockModeType
没有 没有
乐观的
乐观的
OPTIMISTIC_FORCE_INCREMENT
OPTIMISTIC_FORCE_INCREMENT
PESSIMISTIC_READ PESSIMISTIC_READ
PESSIMISTIC_WRITE


升级
UPGRADE_NOWAIT UPGRADE_SKIPLOCKED

PESSIMISTIC_WRITE
PESSIMISTIC_FORCE_INCREMENT



PESSIMISTIC_FORCE_INCREMENT

不建议使用UPGRADE和FORCE锁定模式,而推荐使用PESSIMISTIC_WRITE 。

UPGRADE_NOWAIT和UPGRADE_SKIPLOCKED分别使用Oracle风格的select用于更新nowait或select用于更新跳过锁定语法。

锁定范围和超时

Hibernate还定义了作用域和超时锁定选项 :

  • 范围
    锁定范围允许显式锁定级联到所拥有的关联 。
  • 超时
    超时间隔可能会阻止锁定请求无限期地等待。

在我的下一篇文章中,我将介绍不同的显式锁定设计样式,敬请期待!

翻译自: https://www.javacodegeeks.com/2015/01/a-beginners-guide-to-java-persistence-locking.html

Java持久性锁定初学者指南相关推荐

  1. java持久性与安全性_Java持久性锁定初学者指南

    java持久性与安全性 隐式锁定 在并发理论中,锁定用于保护可变共享数据免受危险数据完整性异常的影响. 因为锁管理是一个非常复杂的问题,所以大多数应用程序都依赖于其数据提供程序隐式锁技术. 将整个锁定 ...

  2. Java时区处理初学者指南

    基本时间观念 大多数Web应用程序必须支持不同的时区,而正确处理时区绝非易事. 更糟糕的是,您必须确保各种编程语言(例如,前端JavaScript,中间件中的Java和作为数据存储库的MongoDB) ...

  3. Java MVC 架构初学者指南

    如果您与 Web 开发场景相关,那么您肯定会遇到数百次(甚至更多)首字母缩略词"MVC".MVC 是当今 Web 编程世界中谈论最多的设计模式之一,这是正确的.在本文中,我们将带您 ...

  4. 【JAVA基础】初学者指南--两万字知识点总结--零基础,超详细 。

    Java基础知识 JAVA入门 JAVA三大版本 JAVA的特性和优势 JAVA运行机制 JVM.JRE.JDK JAVA开发环境搭建 变量.数据类型和运算符 变量(variable) 变量的本质 变 ...

  5. java初学者指南_企业Java中事务隔离级别的初学者指南

    java初学者指南 介绍 基于ACID事务属性的关系数据库强一致性模型. 在本文中,我们将阐明对资源本地事务和JTA事务使用不同的事务隔离级别和各种配置模式的背后原因. 隔离和一致性 在关系数据库系统 ...

  6. java使用d3_[Java教程]一个初学者的指南,使用D3做数据绑定

    [Java教程]一个初学者的指南,使用D3做数据绑定 0 2016-07-03 13:00:09 一个初学者的指南,使用D3做数据绑定 D3.js 是个强大的数据可视化库,可以做出惊艳的图表.比如:气 ...

  7. java初学者指南_Java代理初学者指南

    java初学者指南 尽管Java初学者很快学会了键入public static void main来运行他们的应用程序,但是即使是经验丰富的开发人员也常常不知道JVM对Java流程的两个附加入口点的支 ...

  8. java初学者指南_Java初学者指南

    java初学者指南 Java编程的第一步. 对于Java中的入门教程,请参阅Sun的官方帮助这里 除了核心语言外,还有几种技术和API 介绍. 我们建议首先阅读涵盖 基础知识,并继续其余的教程. 我们 ...

  9. 怎么学习Java编程,Java初学者指南

    怎么学习Java编程,Java初学者指南.Java基于C和C++.第一个Java编译器是由Sun Microsystems开发的,是使用C++中的一些库用C编写的.Java文件使用编译器转换为位代码格 ...

最新文章

  1. java 昨天_JAVA取得昨天的当前时间?
  2. Python2.7连接MySQL5.7 附demo
  3. Windows8.1 64bit环境下搭建深度学习平台之CUDA安装与配置
  4. C++接收字符串数组_PHP常用字符串函数(1),PHP面试重点
  5. 【Mac】一些软件的图片和视频位置 QQ 微信
  6. Python稳基修炼之计算机等级考试易错细节题3(含答案)
  7. 业务线开发流程图(四)
  8. Pgsql登录连接失败原因及解决方法
  9. U盘文件突然变成html文件,U盘里面的文件跟文件夹突然乱码了怎么办
  10. 100+个程序员开发必备参考手册(在线及下载)
  11. 计算机桌面图标乱了,如何解决电脑桌面图标乱跑的问题
  12. J-Flash下载STM32用J-link的设置方法
  13. 拼多多软件测试开发,拼多多事件对我们业务测试的启发
  14. kakfa安装与简单使用
  15. Spring容器是怎么初始化的?
  16. html5中的td tr,html5 表格标签 table tr td
  17. 小程序商店刷榜_微信小程序游戏跳一跳刷榜原理解析!
  18. c语言blackjack设计思路,写一个“BlackJack ”Java应用程序 该计划将测试你的逻辑思维。...
  19. jd什么意思(职位jd什么意思)
  20. 小程序----setDate

热门文章

  1. java实现遍历树形菜单方法——struts.xml实现
  2. 如何获得即时编译器(JIT)的汇编代码(linux环境下)
  3. mysql-on duplicate key update实现insertOrUpdate官方文档
  4. thinking-in-java(20)注解
  5. 如何在工作繁重、睡眠较少的情况下保持旺盛精力?
  6. 实现简单的注解型MVC框架 —— 低配SpringMVC
  7. java无效的源发行版_无效的Java
  8. apache spark_Apache Spark Job的剖析
  9. enumset_枚举集合的EnumSet
  10. jconsole查看连接数_在JConsole和VisualVM中查看DiagnosticCommandMBean