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

Hibernate 悲观锁 的实现

阅读更多

使用一个线程安全的Session:SessionFactory.getCurrentSession()

 
需要配置Hibernate.cfg.xml 属性current_session_context_class = thread
 
从数据库获取数据时,要加锁session.get(SomeClass.Class,id,LockMode.UPGRADE)
 
试了一晚上,用Mysql做的测试,居然不行...下面的代码仅在Oracle下测试通过
 
实体类
 

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

 
 
borrow布尔类型变量用于标识书是否被借出
 
owner 用于标识当前拥有者
 
测试线程类(测试多线程并发访问情况下悲观锁的效果)
 

public class Student extends Thread {
 private int bookid;
 private String stdname;
 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, LockMode.UPGRADE);
   if(book.isBorrow()){ //书已经借出的情况返回false
    System.out.println("isborrow_false");
    return false;
   }
   book.setBorrow(true);
   book.setOwner(this.stdname);
   ss.save(book);
   ts.commit(); 
   return true;  //借书成功,返回true
  }catch(Exception e){
   ts.rollback();
   e.printStackTrace();
   System.out.println("Exception_false");
   return false; //出错的时候返回false
  }finally{
   ss.close();
  }
 }
}

 
 
Hibernate 配置文件 <property name="current_session_context_class">thread</property>
 
产生Session的工具类
 

public class DBFactory {
 public static SessionFactory sf = null;
 static{
  sf = new Configuration().configure().buildSessionFactory();
 }
 public static Session getSession(){
  return sf.getCurrentSession();   //注意,此处返回的是线程安全的currentSession
 }
}
 

 测试类
 

public class Test {
 
 public static void main(String[] args) {
//  addBook();   //用于构造books表的方法调用
  Student lixun = new Student("Lixun",1);    //开启两个独立线程去借书
  lixun.start();
  Student zhougege = new Student("zhougege",1);
  zhougege.start();
 

  

 }
 
 public static void addBook(){ //用于构造books表的方法
  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();
  }
 }
}

 

0
0
分享到:
评论

相关推荐

    Hibernate悲观锁和乐观锁的实现

    在Hibernate中,悲观锁主要通过以下几种方式实现: 1. **For Update**:在SQL查询语句中添加`FOR UPDATE`子句,如`SELECT * FROM table WHERE id = ? FOR UPDATE`,这样在查询时就会锁定相关行,直到当前事务结束。...

    Hibernate乐观锁和悲观锁分析

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

    Hibernate悲观锁与乐观锁

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

    Hibernate悲观锁与乐观锁案例

    在Hibernate中,悲观锁主要通过`LockMode.PESSIMISTIC_WRITE`或`LockMode.PESSIMISTIC_READ`实现。`PESSIMISTIC_WRITE`会阻止其他事务写入,而`PESSIMISTIC_READ`则会阻止其他事务的写操作和更新操作。这种锁定方式...

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

    在Hibernate中,可以通过设置`@LockModeType.PESSIMISTIC_READ`或`@LockModeType.PESSIMISTIC_WRITE`来实现悲观锁。悲观锁的优势在于防止其他事务修改数据,但缺点是可能导致锁竞争,降低并发性能。 乐观锁则相反,...

    Hibernate的乐观锁与悲观锁

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

    hibernate的乐观锁和悲观锁

    **Hibernate中的悲观锁实现**: 在Hibernate中,可以通过`Query.setLockMode()`方法来实现悲观锁。例如: ```java String hqlStr = "FROM TUser AS user WHERE user.name = 'Erica'"; Query query = session....

    hibernate乐观锁和悲观锁学习

    在Hibernate中,我们可以使用`setLockMode`方法对查询结果进行加锁,例如设置`LockMode.UPGRADE`,这将使Hibernate在执行SQL时添加`FOR UPDATE`子句,从而实现悲观锁。 接下来是乐观锁(Optimistic Locking)。与...

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

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

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

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

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

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

    Hibernate 乐观和悲观锁

    在Hibernate中,可以通过`@Lock`注解配合`LockModeType.PESSIMISTIC_READ`或`LockModeType.PESSIMISTIC_WRITE`来实现悲观锁。悲观锁的优点是能确保数据的一致性,但缺点是可能导致较高的锁竞争,降低并发性能。 2. ...

    Hibernate乐观锁

    Hibernate乐观锁是数据库事务控制的一种策略,主要用于处理并发更新数据的情况。在乐观锁的机制下,假设并发用户很少会发生冲突,所以...在实际应用中,可以结合悲观锁和其他并发控制策略,以达到最佳的事务处理效果。

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

    在Java中,synchronized关键字和java.util.concurrent.locks.ReentrantLock都可以实现悲观锁。 1. **悲观锁使用场景**: - 当并发量较小,但对数据的一致性要求非常高时,悲观锁是较好的选择。它能保证在同一时刻...

    hibernate锁实验,以及解决方案

    在Hibernate中,悲观锁主要通过`LockMode.UPGRADE`实现,即使用`SELECT ... FOR UPDATE`语句。 - 乐观锁:在读取数据时不加锁,只有在更新数据时才检查是否有其他事务在此期间修改了数据。通常通过版本号或时间戳...

    hibernate的三锁

    该资源主要是分析:乐观锁解决事务并发.乐观锁校验测试, 基于hiber管理的悲观锁实现

    hibernate乐观锁

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

Global site tag (gtag.js) - Google Analytics