`

乐观锁使用经验一则

阅读更多
<转自http://fantasytree.iteye.com/blog/704953>
假设需要用乐观锁来实现一个物品数量增减操作的原子性,可以这样子做:(框架使用spring和hibernate)

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


Java代码 
@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 ------------>提交事务(出错)

添加重试:
Java代码 
@Transactional(readOnly=false, propagation=Propagation.REQUIRED) 
public void exchange(){ 
    ... 
    修改gift的剩余数量(采用乐观锁); 
    ... 

public void exchange2() throws Exception { 
    try { 
        exchange(); 
    } catch(org.hibernate.StaleObjectStateException e) { 
        exchange(); 
    } 


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

相关推荐

    thinkPHP框架乐观锁和悲观锁实例分析

    例如,在ThinkPHP中实现乐观锁时,通常会使用一个额外的字段,比如“version”,来记录数据的版本信息。在更新操作时,会根据这个字段的值来判断数据是否被修改。如果版本信息与更新前读取到的不一致,则说明数据...

    Hibernate乐观锁和悲观锁分析

    乐观锁则相对乐观,它假设数据在大多数情况下不会发生并发冲突,只有在提交更新时才会检查是否有其他事务修改了数据。如果检测到冲突,则回滚事务,提示用户重新操作。Hibernate通过版本字段(Version)实现乐观锁,...

    乐观锁测试代码

    乐观锁是一种并发控制策略,它假设大多数情况下读多写少,因此在读取数据时不会进行加锁操作,而是尽可能地让多个事务并发执行。只有在更新数据时才会检查在此期间是否有其他事务对数据进行了修改,如果有,则更新...

    Hibernate的乐观锁与悲观锁

    **Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制问题,其中最常用的就是**乐观锁**和**悲观锁**。本文将详细介绍这两种锁的原理、应用场景以及如何在Hibernate中实现。 #### 二、悲观锁...

    吊打面试官之乐观锁实现源码

    乐观锁是一种并发控制策略,与悲观锁相比,它在处理多线程并发时更为乐观,认为数据在大多数情况下不会发生冲突,因此不会像悲观锁那样在读取数据时立即进行加锁操作。在本篇文章中,我们将深入探讨乐观锁的概念、...

    node+js页面乐观锁帧同步示例源码

    在IT行业中,乐观锁是一种重要的并发控制策略,用于管理共享资源。它假设大多数情况下不会发生数据冲突,因此在读取数据时不会立即进行锁定。只有在更新数据时才会检查在此期间是否有其他事务对数据进行了修改。如果...

    hibernate乐观锁和悲观锁学习

    本文主要讨论的是Hibernate框架中两种锁机制的使用:乐观锁和悲观锁。 首先,让我们深入理解悲观锁(Pessimistic Locking)。悲观锁正如其名字所示,假设并发环境中数据会被频繁修改,所以在整个数据处理过程中,它...

    面试必备之乐观锁与悲观锁.pdf

    #### 一、悲观锁与乐观锁的概念 悲观锁和乐观锁是计算机科学中用于处理并发控制的两种不同策略,它们主要应用于多线程环境下数据的一致性和完整性保护。两种锁的设计哲学反映了对数据并发访问时的不同预期。 **...

    Java并发篇乐观锁,悲观锁,自旋锁

    1. **乐观锁**:乐观锁假设在多线程环境下,数据一般不会产生冲突,所以在读取数据时不会加锁,只有在更新数据时才会检查是否有其他线程同时修改了数据,若有冲突则回滚操作。通常通过版本号或时间戳实现。 2. **...

    java乐观锁

    总之,Java乐观锁是并发控制的一种高效策略,它通过减少锁的使用来提升系统的并发能力,但在面对高冲突场景时,需要权衡其带来的额外重试成本。开发者应根据业务特点灵活选择并使用乐观锁,以实现更高效的并发处理。

    Redis分布式锁----乐观锁的实现,以秒杀系统为例.rar

    乐观锁是一种非阻塞的锁机制,它假设在大多数情况下,不会发生并发冲突,因此在读取数据时不会加锁,只有在更新数据时才会检查在此期间是否有其他线程修改了数据。如果在检查阶段发现有冲突,则回滚操作,否则更新...

    Hibernate乐观锁

    Hibernate乐观锁是数据库事务控制的一种策略,主要用于处理并发更新数据的情况。在乐观锁的机制下,假设并发用户很少会发生冲突,所以在读取数据时不会进行任何锁定,而在更新数据时才会检查在此期间是否有其他用户...

    Hibernate悲观锁和乐观锁的实现

    **乐观锁**(Optimistic Lock)则相对乐观,它假设数据在大多数情况下不会发生冲突,因此在读取数据时不加锁,只有在更新数据时才会检查在此期间数据是否被其他事务修改过。在Hibernate中,乐观锁通常通过版本字段...

    数据库事务、hibernate悲观锁和乐观锁

    在Hibernate中,可以使用`@Version`注解来实现乐观锁,该注解会在实体类的一个属性上添加版本字段,每次更新时,Hibernate会比较当前版本号和数据库中的版本号,如果不同,则认为有并发冲突,更新失败。乐观锁的优点...

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

    乐观锁与悲观锁相反,它假定数据不太可能被其他线程或进程修改,因此不会一开始就锁定数据。这种锁机制通常不会直接使用数据库级别的锁定机制,而是通过版本号或其他标记来检测数据是否已被其他事务修改。 **1. ...

    Hibernate 一对多双向映射及乐观锁使用

    **标题解析:** "Hibernate 一对多双向映射及乐观锁使用" 在Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,能够帮助开发者将数据库操作转化为面向对象的编程,简化了数据访问层的实现。"一对多"是...

    Mybatis-Plus中乐观锁@version注解的问题与解决方案.docx

    1. 使用乐观锁的高级用法:使用 Mybatis-Plus 提供的乐观锁高级用法,可以自定义乐观锁的策略,例如使用时间戳或 UUID 作为版本号。 2. 使用悲观锁:使用悲观锁可以锁定记录,防止其他事务同时更新记录。 3. 版本号...

Global site tag (gtag.js) - Google Analytics