使用一个线程安全的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();
}
}
}
分享到:
相关推荐
在Hibernate中,悲观锁主要通过以下几种方式实现: 1. **For Update**:在SQL查询语句中添加`FOR UPDATE`子句,如`SELECT * FROM table WHERE id = ? FOR UPDATE`,这样在查询时就会锁定相关行,直到当前事务结束。...
【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...
Hibernate推荐的乐观锁实现是通过在实体类中添加一个版本字段,每次数据更新时,若版本号与数据库中的版本号匹配,更新成功并递增版本号;若不匹配,则表示数据已被其他用户修改,更新操作将失败。这通常通过`...
在Hibernate中,悲观锁主要通过`LockMode.PESSIMISTIC_WRITE`或`LockMode.PESSIMISTIC_READ`实现。`PESSIMISTIC_WRITE`会阻止其他事务写入,而`PESSIMISTIC_READ`则会阻止其他事务的写操作和更新操作。这种锁定方式...
在Hibernate中,可以通过设置`@LockModeType.PESSIMISTIC_READ`或`@LockModeType.PESSIMISTIC_WRITE`来实现悲观锁。悲观锁的优势在于防止其他事务修改数据,但缺点是可能导致锁竞争,降低并发性能。 乐观锁则相反,...
### Hibernate的乐观锁与悲观锁 #### 一、引言 在并发环境下,尤其是在金融、电商等业务场景中,确保数据的一致性和完整性至关重要。**Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制...
**Hibernate中的悲观锁实现**: 在Hibernate中,可以通过`Query.setLockMode()`方法来实现悲观锁。例如: ```java String hqlStr = "FROM TUser AS user WHERE user.name = 'Erica'"; Query query = session....
在Hibernate中,我们可以使用`setLockMode`方法对查询结果进行加锁,例如设置`LockMode.UPGRADE`,这将使Hibernate在执行SQL时添加`FOR UPDATE`子句,从而实现悲观锁。 接下来是乐观锁(Optimistic Locking)。与...
Hibernate 中的乐观锁实现方式可以通过在对象中增加一个 version 属性来实现版本号控制锁定。例如: ```java public class Account { private int version; .... public void setVersion(int version) { this....
### Java中的悲观锁与乐观锁实现详解 #### 一、悲观锁(Pessimistic Locking) 悲观锁是一种基于对数据安全性的保守态度而设计的锁机制。它假设数据在处理过程中很可能被外界修改,因此在整个数据处理过程中都会将...
Hibernate 实现悲观锁和乐观锁代码介绍 Hibernate 是一个基于 Java 的持久层框架,它提供了多种锁机制来实现事务的隔离性和一致性。在本文中,我们将详细介绍 Hibernate 实现悲观锁和乐观锁的代码实现,并讨论 ...
在Hibernate中,可以通过`@Lock`注解配合`LockModeType.PESSIMISTIC_READ`或`LockModeType.PESSIMISTIC_WRITE`来实现悲观锁。悲观锁的优点是能确保数据的一致性,但缺点是可能导致较高的锁竞争,降低并发性能。 2. ...
Hibernate乐观锁是数据库事务控制的一种策略,主要用于处理并发更新数据的情况。在乐观锁的机制下,假设并发用户很少会发生冲突,所以...在实际应用中,可以结合悲观锁和其他并发控制策略,以达到最佳的事务处理效果。
在Java中,synchronized关键字和java.util.concurrent.locks.ReentrantLock都可以实现悲观锁。 1. **悲观锁使用场景**: - 当并发量较小,但对数据的一致性要求非常高时,悲观锁是较好的选择。它能保证在同一时刻...
在Hibernate中,悲观锁主要通过`LockMode.UPGRADE`实现,即使用`SELECT ... FOR UPDATE`语句。 - 乐观锁:在读取数据时不加锁,只有在更新数据时才检查是否有其他事务在此期间修改了数据。通常通过版本号或时间戳...
该资源主要是分析:乐观锁解决事务并发.乐观锁校验测试, 基于hiber管理的悲观锁实现
乐观锁 求助编辑百科名片相对悲观锁而言,乐观锁...悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库 性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。