java持久性与安全性_Java持久性锁定初学者指南
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锁定
Hibernate支持所有JPA锁定模式和一些其他特定的锁定选项。 与JPA一样,可以为以下操作配置显式锁定:
- 使用各种LockOptions设置锁定实体。
- 得到一个实体
- 加载实体
- 刷新实体
- 创建实体或本机查询
- 创建条件查询
LockModeConverter负责映射JPA和Hibernate锁定模式,如下所示:
Hibernate锁定模式 | JPA LockModeType |
---|---|
没有 | 没有 |
乐观的 读 |
乐观的 |
OPTIMISTIC_FORCE_INCREMENT 写 |
OPTIMISTIC_FORCE_INCREMENT |
PESSIMISTIC_READ | PESSIMISTIC_READ |
PESSIMISTIC_WRITE
|
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持久性与安全性
java持久性与安全性_Java持久性锁定初学者指南相关推荐
- Java持久性锁定初学者指南
隐式锁定 在并发理论中,锁定用于保护可变共享数据免受危险数据完整性异常的影响. 因为锁管理是一个非常复杂的问题,所以大多数应用程序都依赖于其数据提供程序隐式锁定技术. 将整个锁定职责委托给数据库系统既 ...
- java jooq_将Java EE与jOOQ结合使用的初学者指南
java jooq Java EE附带了自己的持久性API:JPA. 当您想要将RDBMS实体(表/关系)映射到Java实体(类)时,JPA最强大,主要遵循1:1映射策略. 其背后的思想是,业务逻辑通 ...
- 将Java EE与jOOQ结合使用的初学者指南
Java EE附带了自己的持久性API:JPA. 当您想要将RDBMS实体(表/关系)映射到Java实体(类)时,JPA最强大,主要遵循1:1映射策略. 其背后的想法是,业务逻辑通常并不像关系代数或S ...
- java验证身份证合法性_Java安全性,第2部分:身份验证和授权
关于本教程 本教程是关于什么的? 也许没有比应用程序安全更重要的软件工程主题. 攻击是昂贵的,无论是来自内部还是外部,而且某些攻击可能会使软件公司承担赔偿责任. 随着计算机(尤其是Internet)技 ...
- java php安全性_java和php安全性有什么不同
java和php安全性有什么不同 发布时间:2020-11-09 11:56:07 来源:亿速云 阅读:96 作者:小新 小编给大家分享一下java和php安全性有什么不同,相信大部分人都还不怎么了解 ...
- java初学者指南_Java代理初学者指南
java初学者指南 尽管Java初学者很快学会了键入public static void main来运行他们的应用程序,但是即使是经验丰富的开发人员也常常不知道JVM对Java流程的两个附加入口点的支 ...
- java初学者指南_Java初学者指南
java初学者指南 Java编程的第一步. 对于Java中的入门教程,请参阅Sun的官方帮助这里 除了核心语言外,还有几种技术和API 介绍. 我们建议首先阅读涵盖 基础知识,并继续其余的教程. 我们 ...
- java初学者指南_企业Java中事务隔离级别的初学者指南
java初学者指南 介绍 基于ACID事务属性的关系数据库强一致性模型. 在本文中,我们将阐明对资源本地事务和JTA事务使用不同的事务隔离级别和各种配置模式的背后原因. 隔离和一致性 在关系数据库系统 ...
- 今天分享的Java开源游戏项目是桌球游戏,初学者也可以用来练习喔~
今天分享的Java开源游戏项目是桌球游戏,初学者也可以用来练习喔~ [源码+教程]Java桌球游戏_Java初级项目_Java练手项目_Java项目实战_Java游戏开发实战教学_Java小游戏_体验 ...
最新文章
- 初等数论--整除--整数表示:算数分解定理/素因数分解式/进制表示
- 全球及中国5-氯-2-羟基苯甲酸产业专项调研与投资潜力预测报告2022-2028年
- 数据库相关(JDBC,存储过程,以及大文本数据处理,mvc设计模式)
- django+mysql 配置一系列问题
- iis服务器udp协议,Win2003系统的IIS服务的w3wp.exe使用UDP的80端口发送大量的数据包,寻求帮助...
- 关联Left Outer Join的第一条记录
- 3.netwox网络工具集入门教程
- 自动控制原理4.4---系统性能分析
- 模拟器:思科 配置静态路由+下一跳如何配置,使三个路由器相互通信
- 树莓派简单摄像头录像并保存视频文件
- Java游戏项目之黄金矿工
- webView系列(五)----历史记录
- 常见中文字体英文名称以及windows默认字体列表
- 用python输出所有的玫瑰花数_用python实现输出3位水仙花数、玫瑰花数、
- 《量化投资策略如何现额益简及PDF电子书下载
- js实现图片连续滚动播放
- 云主机服务比价与预测系统开发心得--第一周(1)--git技术
- 802.11成帧封装实现(五)
- 2023年软考中级网络工程师考试大纲
- 华为无线设备配置WIDS和WIPS
热门文章
- codeforces1454 F. Array Partition
- 在 Java 中初始化 List 的五种方法
- jQuery的三种bind/One/Live/On事件绑定使用方法
- 做到我这样,你也能拿到京东Offer
- 分布式作业 Elastic-Job 快速上手指南
- ERROR in multi ./src/main.js dist/bundle.js
- React中自定义方法
- 2017蓝桥杯省赛---java---B---9(分巧克力)
- 蓝桥杯JAVA省赛2013-----B------4(黄金连分数)
- GitLab创建项目 命令上传代码