hibernate之乐观锁(Optimistic Locking)

相对于悲观锁,乐观锁采取了更加宽松的加锁机制,悲观锁大多数是依赖于数据库,如果对于一个长事务来说,这样的开销会很大!

 

如:在银行系统中,一个人想从银行取钱,他的公司正好在这个时候往他的卡里打钱,如果使用悲观锁的话,会将它的帐号暂时锁死,一个人还好,如果要是有成千上万个巧合呢?这样的话,银行的数据库的压力会很大;

 

乐观锁机制在一定程度上解决了这个问题,乐观锁,大多是基于数据版本(version)记录机制实现,何为数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现;

读取数据时,将版本号一同读出,之后更新时,对此版本号加1。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息化时,如果提交的数据版本号大于数据库表当前版本号,则予更新,否则认为是过期数据;

 

回到银行的例子中:那个人取了2000;当取钱的操作执行完后将数据版本号+1(version=2);公司也往里打了3000,将版本号+1(version=2);公司打钱的操作提交时发现有相同的版本号,那么这个操作被驳回;

 

从例子中可以看出,乐观锁机制避免了长事务中的数据库加锁开销,大大提升了并发量下的系统整体性能表现;

 

需要注意的是:乐观锁机制往往基于系统中的数据存储逻辑,因此也具备一定的局限性,如银行的例子,由于乐观锁机制在我们系统中实现,来自系统外部的用户余额更新操作不受我们影响,因此可能会造成非法数据被更新到数据库中;

 

Hibernate在其数据访问引擎上内置了乐观锁实现,如果不用考虑外部系统对数据库更新操作,利用hibernate提供的透明化乐观锁实现,会简洁!

 

Hibernate中使用乐观锁:

<class name="TUser" table="t_user" optimistic-lock="version">	

 optimistic-lock有如下可选取值:

  • none 无乐观锁
  • version 通过版本机制实现乐观锁
  • dirty 通过检查发生变动过的属性实现乐观锁
  • all 通过检查所有属性实现乐观锁

其中Version实现的乐观锁机制是Hibernate官方推荐的乐观锁实现,也是Hibernate中,目前唯一在实体对象脱离Session发生修改的情况下依然有效的锁机制。这种方法使用较多!

		<version name="version" column="version" type="integer"></version>

 version节点必须出现id节点后;

Android System UI 深度解析:从架构演进到车载 / TV 场景的全维度定制 本文全面解析 Android System UI 的架构设计、功能演进及场景化定制,揭示其作为安卓系统核心交互层的技术特性与生态价值。 阅读详情

相关推荐

Minitab田口设计实战:如何用正交试验优化遗传算法参数(附完整操作步骤)

本文详细介绍了如何利用Minitab田口设计进行遗传算法参数优化,通过正交试验方法显著提升效率。文章涵盖实验设计、Minitab操作步骤、结果分析及高级技巧,帮助工程师快速掌握这一工业级优化技术,实现算法性能的显著提升。

wind6的博客 865

Hibernate事务与并发问题处理(乐观锁与悲观锁)

目录 一、数据库事务的定义 二、数据库事务并发可能带来的问题 三、数据库事务隔离级别 四、使用Hibernate设置数据库隔离级别 五、使用悲观锁解决事务并发问题 六、使用乐观锁解决事务并发问题 Hibernate事务与并发问题处理(乐观锁与悲观锁) 一、数据库事务的定义   数据库事务(Database Transaction) ,是指作为单个逻辑工作单元...

alva88888888的博客 421

【数据集】waymo motion dataset介绍与数据解析可视化

waymo motion数据集下载,数据描述,数据特征和地图特征,数据解析并完成数据可视化

shuaixio的博客 5180

Hibernate_Optimistic Lock_乐观锁

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34248118的博客 243

大厂嵌入式面试常考八股文及算法

1.指向已被释放或无效的内存地址的指针是野指针。互斥锁是一种用于线程同步的机制,用于确保同一时间只有一个线程访问共享资源。多态是面向对象编程中的一种特性,它允许以一种统一的方式处理不同类型的对象,通过相同的接口可以表现出不同的行为。大小端(Endian)指的是在计算机存储和处理多字节数据时,字节的存储顺序。大端序(Big Endian):高位字节存储在低地址,低位字节存储在高地址。类似于将数字的高位放在左边,低位放在右边的表示方式。例如整数值0x12345678在内存中按照大端序排列为。

谢谢大家的关注 6158

FX2N-2AD模块实战:从硬件连接到FROM/TO指令编程详解

本文详细解析FX2N-2AD模拟量输入模块的硬件连接与FROM/TO指令编程技巧,涵盖BFM缓冲存储器配置、梯形图程序设计及工程实战经验。通过实例演示如何实现精准信号采集与数据处理,特别针对PLC系统中的常见故障提供解决方案,助力工业自动化工程师高效完成设备调试与维护。

prometheus9mon的博客 507

optimistic-lock hibernate java_月光软件站 - 编程文档 - Java - Hibernate的锁

Hibernate的加锁模式有:Ø LockMode.NONE : 无锁机制。Ø LockMode.WRITE :Hibernate在Insert和Update记录的时候会自动获取。Ø LockMode.READ : Hibernate在读取记录的时候会自动获取。以上这三种锁机制一般由Hibernate内部使用,如Hibernate为了保证Update过程中对象不会被外界修改,会在save方法实现...

weixin_42217306的博客 271

金融领域强化学习在高频交易中的应用

强化学习(Reinforcement Learning,简称RL)是一种机器学习范式,通过智能体与环境的交互来学习策略,以最大化累计奖励。与监督学习和无监督学习不同,强化学习依赖于动态的反馈机制,智能体通过试错不断优化决策过程。高频交易(High-Frequency Trading,简称HFT)是指在极短时间内进行的大量金融交易,通常利用算法和计算机系统自动执行交易策略。高频交易依赖于高速的数据处理和决策能力,以捕捉市场中的微小价格波动。状态(State):环境在某一时刻的观测,反映了系统的当前情况。

AI天才研究院 893

Hibernate 中optimistic_lock 的配置

在hibernate.cfg.xml中加入以下代码         name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory  >                  在托管环境下,Hibernate不能设置数据库事务的隔离级别,应该让托管的容器去设置这个隔离

java 3165

【STM32项目】基于AI技术的多功能消防机器人(完整工程资料源码)

机器人通过巡逻扫描环境空间与障碍物、定位导航、探测物体/环境进行建模/自动地图测绘、扫描火焰、获取温湿度大小、获取空气安全情况来判断当前环境地点是否安全,检测到温度过高或检测到易燃、烟雾、有毒气体或摄像头识别到火焰时能够通过高压水泵喷射器来实现火焰隔离工作,蜂鸣器进行现场鸣笛报警,同时将当前环境温湿度大小、空气情况、环境地图、是否安全信息,将各个传感器来接收获取到的信息,实时发送到用户手机中的微信小程序,实现与用户远程监视功能,用户同时也能通过手机与电脑远程下发命令来操控机器人来实现交互功能

嵌入式技术开发 1万+

WPF实现棋盘式图片切换效果

实现效果如下: 思路:在自定义控件中放置两个Image控件,点击前后翻页按钮时对图片进行裁剪,随机打乱顺序后添加动作。 步骤: 1、MyImageControl控件 /// <summary> /// MyImageControl.xaml 的交互逻辑 /// </summary> public partial class MyImageControl : UserControl { public static r

dnazhd的博客 1125

hibernate中的optimistic-lock(...

注意:要在user表中增加一个字段:version int   User.hbm.xml"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">     Mapping file autogenerated by MyEclipse Persistence Tools--> op

java_min的专栏 1233

YOLOv8n轻量化实战:10分钟打通实时摄像头目标检测,附参数调优与避坑指南

本文介绍了如何快速入门YOLOv8目标检测框架,通过摄像头实战实现实时检测。YOLOv8凭借轻量化架构和跨平台优势,是新手入门的理想选择。文章详细讲解了环境搭建(1分钟完成)、核心代码逻辑(3分钟掌握)以及性能调优技巧(3分钟进阶),提供可直接运行的代码示例。重点包括:模型选择(优先yolov8n.pt)、摄像头参数优化、置信度阈值调整、检测类别指定等实用技巧,帮助开发者快速实现10-15FPS的实时检测效果,并针对不同场景提供优化建议。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 370

Hibernate 乐观锁(Optimistic Locking)

1.        hibernate基于数据版本(Version)记录机制实现。为数据增加一个版本标识,一般是通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。 2. 例子:   //$Id...

hukn的专栏 1211

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Hibernate 悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)

悲观锁(Pessimistic Locking) 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自 外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定 状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能 真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保...

aduzz62084的博客 223

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

乐观锁与悲观锁 (文章转自网上好像是玉米田的,忘记了)

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

疯子风的个人空间 865

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

hibernate锁

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

142

Hibernate 乐观锁 org.hibernate.StaleObjectStateException 异常

Hibernate乐观锁大多是基于数据版本(version)记录机制实现的。所谓的数据版本,就是为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个version字段来实现。 读取数据时,将此版本号一同读出,之后更新时,对此版本号加1。此时,将提交数据的版本号与数据库表对应记录的当前版本信息进行对比,如果...

wbszlj的博客 460

乐观锁异常解决方法

乐观锁异常解决方法

随风 1万+

Hibernate乐观锁和悲观锁

Hibernate支持两种锁机制: 即通常所说的“悲观锁(Pessimistic Locking)”和 “乐观锁(OptimisticLocking)”。 Hibernate的悲观锁加锁模式有:    1、LockMode.NONE : 无锁机制。    2、LockMode.WRITE :Hibernate在Insert和Update记录的时候会自动获取。    3、LockMod

1156

hibernate乐观锁抛异常ObjectOptimisticLockingFailureException问题的解决方法

解决方法: if("".equals(user.getId())){ user.setId(null); }

一火的专栏 1052

Hibernate Gossip: 樂觀鎖定(Optimistic locking)

悲觀鎖定假定任何時刻存取資料時,都可能有另一個客戶也正在存取同一筆資料,因而對資料採取了資料庫層次的鎖定狀態,在鎖定的時間內其他的客戶不能對資料進行存取,對於單機或小系統而言,這並不成問題,然而如果是在網路上的系統,同時間會有許多連線,如果每一次讀取資料都造成鎖定,其後繼的存取就必須等待,這將造成效能上的問題,造成後繼使用者的長時間等待。 樂觀鎖定(Optimistic locking)則

xiejn的专栏 771

What is optimistic locking in Hibernate

What is optimistic locking in Hibernate

在路上 5731

悲观锁( Pessimistic Locking )乐观锁( Optimistic Locking )

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

dragon901的博客 693

optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was u...

出现以上异常,由于乐观锁version没有对上,导致操作数据库失败。

AI天才研究院 2万+
上一篇: Hibenate之悲观锁(Pessimistic Locking)
下一篇: hibernate之数据加载---Session.get/load
keithJava
博客等级 码龄16年 2粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值