`
fantasytree
  • 浏览: 26628 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

乐观锁使用经验一则

    博客分类:
  • java
阅读更多
假设需要用乐观锁来实现一个物品数量增减操作的原子性,可以这样子做:(框架使用spring和hibernate)

@Entity
@Table(name="tbl_gift")
public class Gift {
	...
	
	//乐观锁
	@Version
	private Long version;

	...
}

@Transactional(readOnly=false, propagation=Propagation.REQUIRED)
public void exchange(){
    ...
    修改gift的剩余数量(采用乐观锁);
    ...
}


以上这段代码在并发修改下会有2种报错(org.hibernate.StaleObjectStateException)的可能:
(1)函数内(提交事务前);
     线程1开事务->读礼品id=1,得version=0 -> 改剩余数量和version -> 提交事务
     线程2开事务->读礼品id=1,得version=0 ----------------------------------->改剩余数量和version(出错)

(2)函数外(提交事务后);
     线程1开事务->读礼品id=1,得version=0 -> 改剩余数量和version -> 提交事务
     线程2开事务->读礼品id=1,得version=0 -> 改剩余数量和version ------------>提交事务(出错)

添加重试:
@Transactional(readOnly=false, propagation=Propagation.REQUIRED)
public void exchange(){
    ...
    修改gift的剩余数量(采用乐观锁);
    ...
}
public void exchange2() throws Exception {
	try {
		exchange();
	} catch(org.hibernate.StaleObjectStateException e) {
		exchange();
	}
}

注意:是使用一个没有事务的方法包住一个有事务的方法。此外,如果在使用OpenSessionInView的情况下,这种重试的方法是没有作用的。
分享到:
评论

相关推荐

    Hibernate锁机制_悲观锁和乐观锁

    乐观锁是一种乐观的认为资料的存取很少发生同时存取的问题,不作数据库层次上的锁定,而是通过应用程序上的逻辑实现版本控制的方法来维护正确的数据。 在 Hibernate 中,乐观锁的实现方式是通过版本号检查来实现。 ...

    浅谈Yii乐观锁的使用及原理

    本文介绍了Yii乐观锁的使用及原理,自己做个学习笔记,也分享给大家,希望对大家有用处 原理: 数据表中使用一个int类型的字段来存储版本号,即该行记录的版本号。更新数据时,对比版本号是否一致 sql查询代码如下...

    J.U.C-AQS框架同步组件之StampedLock乐观锁悲观锁

    StampedLock java1.8提供的, 性能比ReadWriteLock好. ...java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。 悲观锁 悲观锁是就是悲观思想

    【Java】synchronized同步锁详解

    乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低。 每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出,然后加锁...

    SecKill-System:一个秒杀抢购项目:分别提供MySQL乐观锁,Redis分布锁和ZooKeeper分布锁共3种方案

    一个基于Spring Boot的高并发秒杀抢购解决方案,用于个人学习。欢迎提供意见和建议 项目结构 服务注册和发现中心:尤里卡 API网关: Zuul 缓存: Redis 消息形式: Kafka 数据库: MySQL SQL 使用sec_kill; 如果...

    wenda1.zip

    >redis乐观锁通过watch命令监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务失败。也可以调用watch多次监听 >多个Key。 > >Redis事务是一组命令的集合。主要用到两个multi和exec命令。...

    分布式定时任务重复执行解决方案--redis篇.docx

    利用数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。 这里我使用的是redis分布锁的方式实现,自己封装了一个注解,如有问题请联系我一下,谢谢! 加锁 : 同一个定时任务同时多次给redis加锁...

    MySQL对于各种锁的概念理解

    乐观锁大多是基于数据版本记录机制实现,一般是给数据库表增加一个”version”字段。读取数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时将提交数据的版本数据与数据库表对应记录的当前版本信息进行...

    db-lock-poc:一个用于测试抢先式和非抢先式锁的项目,以及一个将Swagger应用于Laravel的项目。

    这是一个尝试使用悲观锁和乐观锁的项目。 抢占式锁定是数据库级别支持的锁定功能,非抢占式锁定是必须直接在应用程序级别实现的锁定功能。 抢占式锁又分为排他锁和共享锁。 排他锁是指进程A在数据库中查找记录以...

    高并发场景防止库存数量超卖少卖

    乐观锁:通过在库存记录中增加版本号字段,更新时验证版本号是否改变,若改变则表示库存已被其他事务修改,避免了长时间锁等待,但需合理设计重试策略。 Redis:利用Redis的高速与原子操作特性,将库存存入Redis中...

    juc:java线程研究记录

    java 中的乐观锁基本都是通过 CAS 操作实现的,CAS 是一种更新的原子操作,比较当前值跟传入 值是否一样,一样则更新,否则失败2,悲观锁 悲观锁是就是悲观思想,即认为写多,遇到并发写的可能性高,每次去拿数据的...

    zxframe demo.rar

    支持乐观锁 *.支持防缓存穿透,防缓存击穿,防缓存雪崩 *.支持多层次缓存:本地一级缓存,本地全局二级缓存,远程缓存,查询缓存,方法级别缓存 *.支持缓存融入事务,业务异常不提交缓存数据 *.支持通用分布式锁 *....

    wireless.zip

    数据库乐观锁,数据库增加一个版本标识 >redis乐观锁通过watch命令监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务失败。也可以调用watch多次监听 >多个Key。 > >Redis事务是一组命令的...

    高性能树型协议处理引擎KNVProtoEngine.zip

    大家都很熟悉Key-Value系统,但KV操作极不方便:-- 你不得不自己做乐观锁(读返回seq->修改->带seq写->seq变化则重头开始);-- 你不得不拉取一堆数据,然后再提取你想要的部分;-- 为了修改一个bit,你不得不把一串...

    mongoose-document-lock:Redis或内存中的Mongoose文档锁定

    如果要实现此锁,通常最好删除架构中的versionKey字段,因为如果使用此库,则不需要乐观锁。安装$ npm install mongoose-schema-lock不幸的是猫鼬文档锁定被:( 然后在你的代码中mongoose . plugin ( require ( '...

    虚拟机学习笔记--周志明老师第三版

    堆内存由多线程共享,若并发创建对象都通过 CAS 乐观锁争夺内存,则效率低。故线程创建时在堆内存为其分配私有的分配缓冲区(TLAB)。 2. 零值初始化对象的堆内存:设置对象头信息、执行构造函数。 对象的内存布局 ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...

    课程设计基于Java实现的校园快递代拿系统源码+sql数据库+项目详细说明.zip

    因为mybatis-plus的使用更为简单,尤其是乐观锁、逻辑删除等) 3. spring security+oauth2使用rsa加密实现认证中心(我这里没有使用io.jsonwebtoken,实际上应该使用,nacos的源码也有使用jjwt,我没使用只是为了更好...

    ArrayList集合与HashMap的扩容原来.docx

    2. ConcurrentHashMap,jdk1.7 添加了分段锁,就是在底层数组上,几个索引上添加一把锁,jdk1.8 添加的则是乐观锁,在每一个索引上都添加锁; 3. Conllections. synchronizedMap(map) 给 HashMap 整个集合添加了锁。...

Global site tag (gtag.js) - Google Analytics