Java持久性锁定初学者指南

隐式锁定

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

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

物理锁

大多数数据库系统使用共享(读取)排他(写入)锁,这归因于特定的锁定元素(行,表)。 尽管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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

负载均衡的集中实现方式

1, 软件 (安装第三方软件做双机,缺点是切换速度,以及故障转移会有问题)2, 硬件(采用第三方硬件设备,缺点是费用贵)3, DNS(价格最便宜,…

uni-app之新建项目无模板选择以及点击创建后一直卡住不动

uni-app:新建项目无模板选择以及点击创建后一直卡住不动 原因:无权限 解决方法:退出HBuilderX,然后以管理员身份启动HBuilderX.exe。解决问题

WildFly和Docker上的Java EE 7动手实验室

Java EE 7动手实验室已在全球范围内交付,它是一个非常标准的应用程序,显示了典型Java EE 7应用程序的设计模式和反模式。 它显示了如何在接近现实的应用程序中使用以下技术: WebSocket 1.0 JSON处理1.0 批次1.0 上下文和依赖注入1.1 Jav…

JSONP跨域的原理解析

转自 http://www.nowamagic.net/librarys/veda/detail/224 JavaScript是一种在Web开发中经常使用的前端动态脚本技术。在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略)。这一策略对于JavaScript…

uni-app运行编译报错

uni-app运行编译失败; 原因:安装目录问题 解决方案:将下载的安装包放在英文目录下,路径中不要出现中文

一罐将其全部统治:Arquillian + Java 8

借助Java 8 ,已实现了许多新的语言改进,以简化开发人员的生活。 在我看来, Java 8的最大优点之一是,在某些情况下,已开发的代码看起来比使用以前的方法更漂亮,我指的是Lambdas和Method引用。 这篇文章不是要…

Gentoo使用sudo

安装app-admin/sudo包 emerge sudo 设置环境变量EDITOR echo EDITOR\"/usr/bin/vim\" >/etc/env.d/99editor env-update 然后注销重新登陆编辑sudo配置文件/etc/sudoer,启用wheel组特权,/etc/sudoer不能用编辑器直接编辑,只能使…

uni-app引入阿里巴巴矢量库图标后,顶部导航栏显示小方块

引入阿里巴巴矢量图标库 首先在阿里巴巴创建项目,拥有图标 具体引入方法参考: [https://blog.csdn.net/Dream_Weave/article/details/88550978?depth_1-utm_sourcedistribute.pc_relevant.none-task&utm_sourcedistribute.pc_relevant.none-task]在…

使用Spring Integration进行消息处理

Spring Integration提供了Spring框架的扩展,以支持著名的企业集成模式。 它在基于Spring的应用程序中启用轻量级消息传递,并支持与外部系统的集成。 Spring Integration的最重要目标之一是为构建可维护且可测试的企业集成解决方案提供一个简单的模型。 …

mysql中的字段类型

Mysql中的字段类型 MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述。概述有意…

js 编码

编码 let url encodeURIComponent(this.url);

使用RxNetty访问Meetup的流API

本文将涉及多个主题:响应式编程,HTTP,解析JSON以及与社交API集成。 完全在一个用例中:我们将通过非夸张的RxNetty库实时加载和处理新的metup.com事件,结合Netty框架的强大功能和RxJava库的灵活性。 Meetup提供了公开可…

SQL Server 2005/2008 导入导出数据常见报错

数据库导入导出时总失败,错误信息如下: 正在验证 (错误) 消息 错误 0xc0202049: 数据流任务 1: 无法在只读列“ID”中插入数据。 (SQL Server 导入和导出向导) 错误 0xc0202045: 数据流任务 1: 验证列元数据失败。 (SQL Server 导入和导出向导) 错…

js、react对象名和对象属性赋值

const resValue {}; resValue[standards${standardsNumber}] ""; Console.log(:test",resValue )//

TIBCO产品的微服务和DevOps

如今,每个人都在谈论微服务。 您可以在数百篇文章和博客文章中读到很多有关微服务的信息。 马丁福勒 ( Martin Fowler )的文章是一个很好的起点,该文章引发了有关这种新架构概念的大量讨论。 另一个很棒的资源是独立于供应商的分…

三层结构

三层结构: 1.UI层,表示层;负责界面,也就是我们看到的前台的东西,最直观的东西都在这里实现; 2.BLL层,业务逻辑层,负责软件的业务逻辑,逻辑代码在这里实现; 3.…

antd listView中onEndReached()失效

antd listView中useBodyScrolltrue会导致onEndReached()失效

使用Degraph管理软件包依赖关系

软件开发领域的很大一部分是使系统的复杂性尽可能地低。 但是复杂性到底是什么? 虽然确切的语义有很大不同,但取决于您询问的人,大多数人可能都认为这与系统中部件的数量及其交互有很大关系。 考虑太空中的大理石,即行星&#xf…

[转载] 应急管理体系及其业务流程研究

转载于:https://www.cnblogs.com/6DAN_HUST/archive/2013/03/04/2942337.html

div中直接绑定富文本值

<div dangerouslySetInnerHTML{{ __html: ${currentGoods.ShortDescription} }}/>