java 持久_Java持久锁总结 -解道Jdon

并发主题

Java与持久相关的锁总结

本文总结Java中有关数据库保存持久数据的锁机制,不只是纯粹数据库自身的锁,本文主要就Java持久层三个技术数据库、JPA和Hibernate的锁应用进行了总结。

在并发理论中,锁是用于保护可变的共享数据,以保证数据的完整性,大多数应用程序都是依赖于数据库本身提供的隐藏在数据库机制内的锁技术,很多初学者可能都没有意识到。

将整个系统的锁职责委托给数据库系统,虽然可以简化应用程序的开发,防止并发问题如死锁,但是还是有可能出现死锁的,但是数据库可以检测到并采取安全措施,比如任意释放两个竞争锁中一个。

物理锁

大多数的数据库系统使用的是共享读锁和排他写锁,这是因为其特定的锁元素(行 表),而物理锁是由SQL标准确定的,其悲观的方式可能或妨碍系统的伸缩扩展性Scalable。

大多数数据库是使用轻量的锁技术,比如多版本并发控制,隐式的数据库锁机制的背后是事物隔离级别设置ACID,每个隔离级别是一个预定义的锁方案,目的是防止某一组数据的完整性异常。

READ COMMITTED(已提交读取)是使用查询级别的共享锁,对于当前事务中修改数据的操作采取排他锁,REPEATABLE (可重复读)和SERIALIZABLE (序列化)是在读取和写入排他锁需要时使用事务级别的共享锁。

逻辑锁

如果说数据库锁对于批处理系统已经足够,那么对于跨越多个数据库的多个Web请求来说,这种长对话事务需要一个逻辑(乐观)锁机制则是更合适些。

Hibernate提供的乐观锁(conversation-level repeatable read storage)可以确保数据的完整性,但是缺乏交易的可扩展性;JPA提供乐观锁和持久上下文可重复读两种机制,为实现逻辑锁提供了多样选择。

显式锁

前面提到由数据库和持久框架提供的隐式锁已经满足大多数应用程序的并发控制要求了,但是有时如果你需要一个更细粒度的锁策略,那么就需要使用显式锁了。

大多数数据库系统支持查询时间独占锁指令,如 SELECT FOR UPDATE or SELECT FOR SHARE,因此我们可以使用较低级别的默认隔离级别(READ COMMITTED),而具体交易情况,使用共享和独占锁。

大部分乐观锁实现只是验证修改的数据,但是JPA允许你明确指定乐观锁的方式。

JPA锁

作为数据库抽象层,JPA能够从底层RDBMS锁获得隐式的锁机制,JPA也提供优化可选自动的尸体版本控制机制。JPA提供显式锁为了如下操作:

locking 锁定一个存在的持久化上下文实体

querying 通过JPQL查询, 或通过Criteria 或数据库SQL查询

显式锁类型

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

锁作用域和超时

JPA 2.0通过下面值定义javax.persistence.lock.scope:

NORMAL因为对象图会跨越多个数据表,一个显式锁也会涉及到多个表(例如 joined inheritance, secondary tables).因为整个实体相关联的行被锁住,many-to-one多对一和一对一one-to-one外键将锁定,但不会锁定对方父关联,这个作用域不会涉及到子集。

EXTENDED这个显式锁将涉及到元素集合和junction tables, 但是不会实际锁定子实体,这个锁用于防止删除现有的子对象是有用的,同时允许幻读phantom reads或实际子实体状态的改变。

JPA 2.0也引入了javax.persistence.lock.timeout属性,我们能够配置多少毫秒超时,这样一个请求在这个锁必须等待一直到过了超时,然后会抛出PessimisticLockException。

Hibernate锁

Hibernate支持所有JPA锁模型,有一些附加的特定锁选项,显式锁能针对如下操作配置:

创建一个实体或原生数据库查询Query

创建一个creating aCriteriaquery

LockModeConverter是负责JPA和Hibernate锁模型映射:

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

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

相关文章

cacti 监控安装失败

1首先这是基于lnmp模式进行的 2yum安装 yum -y install httpd mysql mysql-server php php-mysql php-json php-pdo 3lib库 yum -y install cairo-devel libxml2-devel pango pango-devel 4 解压rrdtool-1.3.1.tar.gz Cd rrdtool-1.3.1 ./configure --prefix/usr/local/rrdtoo…

project 模板_施工进度横道图不会做?18份计划模板收藏好,输入参数迅速成图...

施工进度横道图不会做?18份计划模板收藏好,输入参数迅速成图作为施工组织设计的关键内容,施工进度计划控制了工程施工进度、工程施工期限等各项施工活动。进度计划是否合理,直接影响施工速度、成本和质量。因此施工中的其他工作必…

JavaScript学习系列3 -- JavaScript arguments对象学习

在实际项目开发中,目前还是很少使用到JavaScript 中的arguments对象,那么它到底是干什么用的呢 arguments是JavaScript中的一个类数组对象,它代表传给一个正在执行的函数function的参数列表。 看完这个定义,需要明白&#xff0c…

二叉树垂直遍历 java_【004】二叉树垂直遍历

二叉树垂直遍历题目描述输入输出示例输入实例输出DFSBFS更简单的方法二叉树垂直遍历题目描述对于一个二叉树,输出它的垂直遍历结果;对于同一列的节点,按照从左向右,从上向下的顺序排列。例如,对于以下二叉树&#xff1…

matlab二元一次方程求解_2-函数的求解计算

一、本期介绍函数的求解有两种(1)已知x求y(2)已知y求x1.1已知x求y回想我们上一期,讲了多项式求解的方法,也是已知x求y。想一下,多项式不也是函数的一种吗,所以本期求解的方法同样适用…

linux lnmp yum版安装

LAMP(linux、apache、mysql、php),是四个套件的合成,简单讲就是要把php运行在linux上,需要依赖apache和mysql数据库。 1 准备好一个linux系统(centos7)   确保selinux、firewall已经关闭   …

面向对象的四大特征

面向对象的四大特征 面向对象的程序设计方法要求语言必须具备抽象、封装、继承和多态性这几个关键要素。 面向对象程序设计,是通过为数据和代码建立分块的内存区域,以便提供对程序进行模块化的一种程序设计方法。对象是计算机内存中的一块区域&#xff0…

python装饰器调用顺序_聊一聊Python装饰器的代码执行顺序

为什么写这篇文章?起因是QQ群里边有人提了一个问题:之前导入模块只需要1~2秒,为什么现在变成需要2~3分钟?我的第一感觉是:是不是导入的模块顶层代码里边,做了什么耗时的事情。隔了一天,他的问题…

centos7 安装cacti

1 cacti运行环境准备   cacti需要phpapachemysqlsnmpRRDTool,以及cacti本身。cacti本体是用php开发的网站,通过snmp对远端设备信息进行采集。apachemysqlphp在以前已经做过了      这里只对剩余的部分进行安装。 2 安装snmp    yum install -y n…

python第三方库-基础

1.python社区 python有一个全球社区,提供了超过十三万个涵盖各种领域应用的第三方库,该社区可通过 http://pypi.org/ 来访问。PyPI(Python Package Index)是python包的索引,学会检索并利用PyPI,找到合适的第…

python折线图matplotlib库_Python如何使用内置库matplotlib绘制折线图

这篇文章主要介绍了Python如何使用内置库matplotlib绘制折线图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下环境准备:需要安装matplotlib,安装方式:pip install matplotlib…

linux下zabbix安装

1本人用的是apachemysqlphp 2下载zabbix软件包,官网下载 https://sourceforge.net/projects/zabbix/files/ZABBIX Latest Stable/2.2.23/zabbix-2.2.23.tar.gz/download 上传到 var/www/html下 3cd /var/www/html #进入软件包下载目录 tar zxvf zabbix-2.2.23.tar.g…

java cas机制_Java CAS机制详解

CAS目的:在多线程中为了保持数据的准确性,避免多个线程同时操作某个变量,很多情况下利用关键字synchronized实现同步锁,使用synchronized关键字修可以使操作的线程排队等待运行,可以说是一种悲观策略,认为线…

「一本通 4.1 练习 2」简单题

题目描述 题目来源:CQOI 2006 有一个 n 个元素的数组,每个元素初始均为 0。有 m 条指令,要么让其中一段连续序列数字反转——0 变 1,1变 0(操作 1),要么询问某个元素的值(操作 2&…

定时器取数据时实时进来的数据_Redis-数据淘汰策略amp;持久化方式(RDB/AOF)amp;Redis与Memcached区别...

Redis与Memcached区别: 两者都是非关系型数据库。主要有以下不同: 数据类型: Memcached仅支持字符串类型。 redis支持:String,List,set,zset,hash 可以灵活的解决问题。 数据持久化: Memcached不支持持久化。 Redis采…

linux 下建立多个tomcat

第一步:复制,解压 将准备好的tomcat压缩包复制到你准备安装的目录,我的tomcat压缩包名字是tomcat.tar.gz,我的安 装目录是 /usr/java/tomcat 第二步:解压tomcat [rootaliServer tomcat]# tar -xvf tomcat.tar.gz 第三步&#xff…

java apply 函数_Js(Javascript)中的apply方法的使用

Function.apply(obj,args)方法能接收两个参数,简单说apply方法作用就是给类或方法中的this赋值。所以学会这个方法首先要知道this的作用。(this的用法可以看一下这个链接:http://www.cjavapy.com/article/8/ )obj:这个对象将代替Function类里…

linux iptables配置

1 iptables默认系统自带 setup 2重启防火墙 /etc/init.d/iptables restart 3接受端口 Vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT 4 #配置,禁止进,允许出,允许回环网卡 iptables -P I…

memcpy函数_[PART][BUG][MSVCRT][C][CCF NOI1097] 关于memcpy的坑

[Incompleted]CCF NOI1097 试题,本人的源码:Ubuntu Pastebin​paste.ubuntu.comUbuntu PastebinUbuntu Pastebin: SourceCodebyJulianDroid​paste.ubuntu.com满分代码:https://blog.csdn.net/tigerisland45/article/details/71038551​blog.…

Bugku杂项-convert

一进去就发现一堆二进制数,然后考虑怎么才能把这个和隐写扯上关系。首先,二进制我们肉眼就是看不懂再说什么的,这里就想到了转换,再联想上hex将原始数据转化为16进制。我们可以先把2进制转化为16进制,然后再放到hex上看…