`
namezhou
  • 浏览: 158642 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate 乐观锁 的实现

阅读更多

实体类添加额外的属性version,映射文件中采用属性version 类似于版本控制系统(svn/cvs)的机制

并发冲突时会抛出StableObjectStateException
 
实体类
 

public class Book {
 private int bid;
 private String name;
 private String owner;
 
 private int version;
} //省略无参构造函数和getter/setter

 
 
测试线程类(测试多线程并发访问情况下悲观锁的效果)
 

public class Student extends Thread {
 private int bookid;
 private String stdname;
 public boolean flag = false;
 public Student(String name,int bookid){
  this.bookid = bookid;
  this.stdname = name;
 }
 public void run(){
  
  if(this.borrowBook()){
   System.out.println(this.stdname + "借书 成功!!!");
  }else{
   System.out.println(this.stdname + "借书 失败!!!");
  }
 }
 public boolean borrowBook(){
  Session ss = null;
  Transaction ts = null;
  Book book = null;
  try{
   ss = DBFactory.sf.openSession();
   ts = ss.beginTransaction();
   book = (Book) ss.get(Book.class,bookid);
   book.setOwner(this.stdname);
   ss.save(book);
   ts.commit();
   return true;
  }catch(Exception e){
   ts.rollback();
   e.printStackTrace();
   System.out.println("Exception_false");
   return false;
  }finally{
   ss.close();
  }
 }
}

  
映射文件
 

<hibernate-mapping package="optimistic.entity">
 <class name="Book" table="opti_book">
  <id column="bookid" name="bid">
   <generator class="native"/>
  </id>
  <version name="version" column="version"></version>  <!--此处添加-->
  <property column="bookname" name="name" type="string"/>
  <property column="owner" name="owner" type="string"/>
 </class>
</hibernate-mapping>

  
测试类
 

public class Test {
 
 public static void main(String[] args) {
//  addBook();
  Student lixun = new Student("Lixun",1);
  lixun.start();
  Student zhougege = new Student("zhougege",1);
  zhougege.start();
 }
 
 public static void addBook(){
  Book book = new Book();
  book.setName("**Mei");
  Session ss = null;
  Transaction ts = null;
  try{
   ss = DBFactory.sf.openSession();
   ts = ss.beginTransaction();
   ss.save(book);
   ts.commit();
   ss.close();
  }catch(Exception e){
   ts.rollback();
   e.printStackTrace();
  }
 }
 
}

 产生的异常:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [optimistic.entity.Book#1]
 at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1714)
 at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2357)
 at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2257)
 at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2557)
 at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:92)

1
0
分享到:
评论

相关推荐

    Hibernate乐观锁和悲观锁分析

    【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...

    Hibernate悲观锁和乐观锁的实现

    在Hibernate源码中,乐观锁的实现主要依赖于`AbstractEntityPersister`类的`checkOptimisticLocking()`方法,它会比较当前对象的版本信息与数据库中的版本信息,如果不同则抛出`StaleObjectStateException`异常。...

    Hibernate乐观锁

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

    hibernate乐观锁和悲观锁学习

    在Hibernate中,通常通过在实体类的映射文件中设置`optimistic-lock`属性来实现乐观锁,比如设置为`version`,这将利用数据库的版本字段来检测并发冲突。当尝试更新时,如果发现版本号已变,说明有其他事务进行了...

    Hibernate的乐观锁与悲观锁

    ### Hibernate的乐观锁与悲观锁 #### 一、引言 在并发环境下,尤其是在金融、电商等业务场景中,确保数据的一致性和完整性至关重要。**Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制...

    hibernate的乐观锁和悲观锁

    **Hibernate中的乐观锁实现**: 在Hibernate中,可以通过配置文件或注解的方式指定实体类的乐观锁策略。例如,使用版本号字段: ```java @Entity @Table(name = "account") public class Account { @Id @...

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

    4. **Hibernate乐观锁实现**:在Hibernate中,可以通过在实体类上添加`@Version`注解来启用乐观锁,该注解对应的字段会在数据库中自动生成并维护。在更新时,Hibernate会自动处理版本号的比较和更新。 5. **配置...

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

    Hibernate 中的乐观锁实现方式可以通过在对象中增加一个 version 属性来实现版本号控制锁定。例如: ```java public class Account { private int version; .... public void setVersion(int version) { this....

    Hibernate悲观锁与乐观锁

    Hibernate推荐的乐观锁实现是通过在实体类中添加一个版本字段,每次数据更新时,若版本号与数据库中的版本号匹配,更新成功并递增版本号;若不匹配,则表示数据已被其他用户修改,更新操作将失败。这通常通过`...

    hibernate乐观锁

    乐观锁 求助编辑百科名片相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库 性能的大量开销,特别是对长事务而...

    Hibernate悲观锁与乐观锁案例

    在Hibernate中,乐观锁通常通过版本字段(version)或者时间戳(timestamp)实现。当多个线程尝试同时更新同一数据时,只有版本号或时间戳匹配的更新才能成功,其他不匹配的更新会被回滚。这种方式减少了锁的使用,...

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

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

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

    ### Java中的悲观锁与乐观锁实现详解 #### 一、悲观锁(Pessimistic Locking) 悲观锁是一种基于对数据安全性的保守态度而设计的锁机制。它假设数据在处理过程中很可能被外界修改,因此在整个数据处理过程中都会将...

    Hibernate version 乐观锁 (xml方式)

    在了解了Hibernate乐观锁的XML配置后,我们可以结合源码进一步分析其实现细节。在Hibernate中,乐观锁的处理主要在`org.hibernate.event.internal.DefaultMergeEventListener`和`org.hibernate.event.internal....

    Hibernate 乐观和悲观锁

    在Hibernate中,乐观锁通常通过版本号(Version)或时间戳(Timestamp)来实现。当多个事务尝试更新同一条记录时,如果某个事务的版本号与数据库中的不匹配,那么更新会被拒绝。这样可以避免锁竞争,提高并发性能,...

    Hibernate实现悲观锁和乐观锁代码介绍

    Hibernate 实现悲观锁和乐观锁代码介绍 Hibernate 是一个基于 Java 的持久层框架,它提供了多种锁机制来实现事务的隔离性和一致性。在本文中,我们将详细介绍 Hibernate 实现悲观锁和乐观锁的代码实现,并讨论 ...

    java乐观锁

    常见的乐观锁实现方式有两种:版本号机制和CAS(Compare and Swap)算法。 1. 版本号机制:在数据表中增加一个版本字段,每次读取数据时都记录当前版本号,当更新数据时,会比较当前版本号与数据库中的版本号是否...

    乐观锁version-练习

    2. **Hibernate的乐观锁机制**:了解Hibernate如何通过`version`字段实现乐观锁,包括`@Version`注解的使用、对象状态管理及冲突检测。 3. **乐观锁与悲观锁的区别**:对比两种锁的优缺点,例如悲观锁的资源消耗大...

Global site tag (gtag.js) - Google Analytics