hibernate中的乐观锁和悲观锁

Java 中 Hibernate 的乐观锁与悲观锁应用 本文旨在为Java开发者提供关于Hibernate框架中乐观锁和悲观锁的全面指南。我们将探讨这两种并发控制机制的核心概念、实现原理、使用场景以及性能考量。本文范围涵盖Hibernate 5.x版本,但大部分概念也适用于其他版本。文章首先介绍并发控制的基本概念,然后分别深入探讨乐观锁和悲观锁的实现机制。接着通过实际代码示例展示具体应用,最后讨论性能优化和最佳实践。乐观锁(Optimistic Locking): 假设并发冲突很少发生,只在提交时检查数据是否被修改。 阅读详情

hibernate支持两种锁:悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)

悲观锁:指的是对数据库数据被外界的修改持保守态度(无论是本系统的事务处理,或者是外部系统的事务处理),在整个数据处理的过程数据都处于锁定的状态。hibernate中的悲观锁,是依靠数据库中的锁机制(因为只有数据库层才能控制本系统和外部系统对数据库的数据操作)。

例如”select * from user where userName=’Johnson’ for update“这条sql锁定了user表中所有userName=’Johnson’的记录,本次事务提交之前,外界无法修改这些记录。

hibernate中的悲观锁,也是基于数据库的锁机制实现的。

String hqlStr ="from TUser as user where user.name='Lili'";
Query query = session.createQuery(hqlStr);
query.setLockMode("user",LockMode.UPGRADE); //加锁
List userList = query.list();//执行查询,获取数据

上面的代码中setLockMode第一个参数指定了别名为user的返回的记录进行上锁。
生成的sql为:

select tuser0_.id as id, tuser0_.name as name, tuser0_.group_id
as group_id, tuser0_.user_type as user_type, tuser0_.sex as sex
from t_user tuser0_ where (tuser0_.name='Erica' ) for update

可见hibernate通过数据库中的for update子句实现悲观锁机制。
hibernate的加锁模式:
LockMode.NONE : 无锁机制。
LockMode.WRITE : Hibernate 在 Insert 和 Update 记录的时候会自动获取。
LockMode.READ : Hibernate 在读取记录的时候会自动获取。
以上这三种锁机制一般由 Hibernate 内部使用,如 Hibernate 为了保证 Update过程中对象不会被外界修改,会在 save 方法实现中自动为目标对象加上 WRITE 锁。
LockMode.UPGRADE :利用数据库的 for update 子句加锁。
LockMode. UPGRADE_NOWAIT : Oracle 的特定实现,利用 Oracle 的 for update nowait 子句实现加锁。
上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现:
Criteria.setLockMode
Query.setLockMode
Session.lock

相对于悲观锁,乐观锁的锁机制就显得比较宽松。悲观锁大部分情况依靠数据库的锁机制实现,来保证最大程度的独占性。但另一方面数据库的开销非常大,尤其对于长事务来说。

乐观锁大部分是基于数据版本(version)记录机制实现。即在数据表中增加一个版本标识,读取出数据时,连带这个版本标识一起读出,更新数据的时候,把版本标识加1。将提交版本数据跟数据库中当前版本信息对比,如果提交的数据中版本号大于数据表当前的版本号,则允许更新,否则认为是过期数据。

hibernate的乐观锁主要有两种方式:version和时间戳

举个配置的例子:

    <?xml version="1.0"?>  
    <!DOCTYPE hibernate-mapping PUBLIC  
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    <hibernate-mapping>  
        <class name="test.Dir" table="t_dir">  
            <id name="id" type="string" unsaved-value="null">  
             <column name="id_" sql-type="char(32)" not-null="true" />  
             <generator class="uuid.hex" />  
        </id>  
        <!--这里version节点必须要配在id之后-->
            <version column="version_" name="version" />  
            <property name="name" column="name_" type="string"/>  
            <property name="size" column="size_" type="long" />  
            <many-to-one name="dir" column="pid_" class="test.Dir" />  
        </class>  
    </hibernate-mapping>  

乐观锁带来的负面问题:如果两个不同的事务同时读取一条数据并进行更新时,程序会报异常:org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)。这时候就要捕获异常,然后处理并提醒用户再次提交。
同样,乐观锁也有局限性。就是只控制了本系统的事务并发操作,而外部系统对数据表的操作却无法控制,此时有个解决办法就是:在存储过程里实现乐观锁机制,这样无论是本系统或是外部系统的事务操作,数据库都可以控制。所以,在设计阶段,尽量考虑到各种情况,究竟是在程序端实现好,还是数据库端实现比较好。

Hibernate锁机制_悲观锁和乐观锁 立即下载

相关推荐

Hibernate悲观锁和乐观锁的实现

NULL 博文链接:https://12345678.iteye.com/blog/721836

Hibernate悲观锁/乐观锁

默认事务之间会产生数据冲突,所以要求事务在读取数据的时候就对数据加锁,保证数据访问的排它性; 该锁将一直被事务持有,直到事务结束才会释放锁。 一、悲观锁 最常用的,是对查询进行加锁(LockMode.UPGRADE和LockMode.UPGRADE_NOWAIT),悲观锁的可以通过以下三种方式实现: 1)调用Session.load(),并设置了LockMode 2)调用Session.

yh_zeng2的博客 546

Hibernate乐观锁和悲观锁分析

Hibernate乐观锁和悲观锁分析,针对在使用HIBERNATE时怎么配置乐观锁进行了详细的范例讲解

Hibernate悲观锁

悲观锁(pessimistic lock)是指在每次操作数据时,总是悲观地认为会有其他事务操作同一数据,因此,在整个数据处理过程中,会把数据处于锁定状态。悲观锁具有排他性,一般由数据库实现。在锁定时间内,其他事务不能对数据进行存取等操作,这可能导致长时间的等待问题。在中,用户可以显示地设定锁模式,通常在应用中会设定如下两种锁模式。

unber的博客 389

similarity network fusion for aggregating data types on a genomic scale

基因组规模上的聚合数据类型的相似性网络融合 摘要:         近期的技术已经使收集不同类型的全基因组数据十分划算,结合这些数据去创建一个给定的疾病或生物过程的一个全面视图的计算方法是有必要的。相似网络融合(SNF:similarity network fusion)通过创建每一个可利用的数据类型的样本(如,患者)的网络可以解决这个问题。例如,创建一个给定一群患者疾病的全面视图,SNF计算

augustar学习笔记 7869

永磁同步电机矢量控制——电流内环前馈解耦策略

在采用永磁同步电机矢量控制时,ud和uq的指令值存在耦合项。需要对其进行解耦,目前,常用的解耦设计方法有前馈解耦、偏差解耦以及内模控制,本文主要分享电流内环前馈解耦控制策略。

a12312341ll的博客 8691

hibernate(四)之乐观锁与悲观锁

hibernate四之乐观锁与悲观锁一、Hibernate锁机制二、ssh整合 一、Hibernate锁机制 Hibernate提供了乐观锁和悲观锁机制,主要用于解决事务并发问题。 悲观锁:Hibernate认为任何操作都可能发生并发,因此在第一个线程查询数据时,就把该条记录锁住。此时其他线程对该记录不能做任何操作(即增删改操作都不能)。必须等当前线程事务结束才可以进行操作。 悲观锁的实现原理 Hibernate悲观锁机制实际上是采用数据库的锁机制实现。 数据库中SQL语句最后加for update则把记录

faramita_of_mine的博客 1185

自动驾驶仿真 (四)—— 基于PreScan与Simulink的AEB系统多场景验证

本文详细介绍了基于PreScan与Simulink的AEB系统多场景验证方法,涵盖标准场景搭建、复杂工况扩展及控制策略优化。通过仿真技术,显著降低测试成本并提升场景覆盖率,有效解决实车测试中的痛点问题。特别适用于自动驾驶领域的AEB系统开发与验证。

weixin_28273593的博客 248

Hibernate乐观锁和悲观锁详解

悲观锁: 悲观锁是对数据库而言的,数据库悲观了,他感觉每一个对他操作的程序都有可能产生并发。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。...

子冰吖的博客 1711

CRaxsRat v7.6 安装与使用教程(附工具下载)

摘要:本文介绍远程管理工具CRaxsRat v7.6的合法应用与基本操作,强调仅限授权环境使用。该工具支持多客户端管理、TLS加密及文件/进程控制等功能,适用于内网维护与安全测试。安装需Windows 10/11系统及.NET 4.8,步骤包括解压运行、配置监听端口及生成客户端。文中提醒防火墙设置与杀软误报问题,并重申禁止非法用途,建议在虚拟机或隔离环境学习使用。

lzj781210的博客 3787

openeuler在线/离线安装docker服务

openeuler在线/离线安装docker服务

haixuti7的博客 1071

Hibernate 悲观锁和乐观锁详解

首先我们来说下锁(locking)的概念: 这个概念在我们学习多线程的时候曾经接触过,其实这里的锁和多线程里面处理并发的锁是一个道理,都是暴力的把资源归为自己所有。这里我们用到锁的目的就是通过一些机制来保证一些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无法被其他程序修改。Hibernate支持两种锁机制:即通常所说的“悲观锁(Pes...

ai8717995的博客 568

算法面试准备 - 手撕系列第五期 - 单头注意力机制(包括Self_atten和Cross_atten)

算法面试准备 - 手撕系列第五期 - 单头注意力机制(包括Self_atten和Cross_atten)

m0_62030579的博客 3606

Hibernate的悲观锁和乐观锁

Hibernate的悲观锁和乐观锁 1.Student s=sess,get(Student.clsss,id,LockMode.UPGRADE); 五中模式: LockMode.NONE: 查询时先在cache(缓存)里找,如果没有,在到db里加载无锁机制。 LockMode.READ: 不管cache有没有,都查询数据库,Hibernate在读取记录的时候会自动获取。 LockMO...

zhupengqq的博客 96

零基础DSP实战TMS320F28035:第九节,ADC比较器&EPWM

ADC比较器框图如下所示:-电压-----------------------------输出-电压A>电压B------------------ 1-电压A

sinat_30943509的博客 2535

面试问题总结——关于OpenCV(一)

整理了一下网上和我面试中遇到的关于OpenCV相关的问题。 其中因为我的简历中有个项目用到了特征点检测相关的知识,所以整理了SIFT/SURF和FLANN。 有些知识点也不深入,对于写的不对的地方,欢迎指正。 关于OpenCV的内容 1.OpenCV中cv::Mat的深拷贝和浅拷贝问题   深拷贝:分配新内存的同时拷贝数据,当被赋值的容器被修改时,原始容器数据不会改变。   浅拷贝:仅拷贝数据,当被赋值容器修改时,原始容器数据也会做同样改变。 OpenCV的Mat时,有几种赋值方式分别为:   深.

boss-dog 1万+

Hibernate中乐观锁和悲观锁。

在hibernate事务处理中造成的写问题(丢失更新的问题:更新一定是查询最新的结果),之前博客简单描述了一下解决方法,这篇博客,来详细讲解一下如何用乐观锁和悲观锁解决写问题。 下面我们通过例子来理解: 在事务操作中,最经典的就是转账案例, 如图所示: AB两个用户同时操作数据库,A用户在原余额上添加了10块钱,所以是110元,但是B用户添加了30元,却变成了140元,这就造成了并发操...

越是憧憬,越要风雨兼程 365

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

hibernate的悲观锁和乐观锁

一、hibernate的锁机制 多个用户可能同时读取同一个数据。为了保证 数据的一致性,需要一种机制来保障其他的程序在这一时刻不能修改这一数据。即上锁。 hibernate中提供了 两种上锁机制,悲观锁和乐观锁。 二、悲观锁 悲观锁指的是线程对数据被外界修改持保守态度。假定任何时刻存取数据时,都可能有另一个客户也正在存取同一笔数据,为了保持数据被操作的一致性,于是对数据采取了数据库层次的锁...

zdd183的博客 255

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Hibernate乐观锁与悲观锁

1.悲观锁 一个事务访问某数据库中一定量的数据时,锁死这些数据,在commit()释放锁前禁止其他线程的任何操作。Hibernate总是使用数据库的锁定机制,从不在内存中锁定对象! 必然发送的sql:for update. 例如:select * from Emp for update.锁死了Emp表的数据 使用Hibernate设置数据库隔离级别以实现悲观锁: 在Hibernate的配置文件中可...

oLengYueHun的博客 356

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Hibernate锁机制 悲观锁、乐观锁

悲观锁         它指的是对数据被外界修改持保守态度。假定任何时刻存取数据时,都可能有另一个客户也正在存取同一笔数据,为了保持数据被操作的一致性,于是对数据采取了数据库层次的锁定状态,依靠数据库提供的锁机制来实现。 基于jdbc实现的数据库加锁如下:  select * from account where name="Erica" for update 在更新的过程中,数据库处于加

枫飘瞬间 2397

Hibernate的悲观锁与乐观锁

Hibernate提供了两种锁机制,悲观锁和乐观锁。 1.悲观锁 其中悲观锁的实现依赖于数据库的锁机制,如果数据库底层没有实现相应的数据排他性,那么就无法实现悲观锁。 加锁模式有: LockMode.None 不加锁 LockMode.Write 在insert和update的时候会自动获取 / /还是不明白的因为没有用过 LockMode.Read ...

wmg494005678的专栏 152

Hibernate的乐观锁与悲观锁

说明:本文来自互联网,本文内容可参考HIBERNATE手册   Hibernate的乐观锁与悲观锁 锁( locking ) 业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数据再发生变化。此时,我们就需要通过一些机制来保证这些数据在某个操作...

专偷别人的文章 129

hibernate中的悲观锁和乐观锁的实现

Java 中的悲观锁和乐观锁的实现 锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种,也可能是几个小时),数据再发生变化。此时,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓 的“锁”,即给

xfans12000的专栏 1626
上一篇: web.xml中classpath:和classpath*:的区别
下一篇: jdk动态代理实现总结和范例
H阿布
博客等级 码龄12年 24粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值