Object lock = new Object();
private void transactionCollision() throws InterruptedException {
Session session = HibernateSessionFactory.getSession();
User ben = (User)session.get(User.class, new Long(1));
new BranchThread().start();
synchronized (lock) {//Before being notify the obj would be locked.
lock.wait();
}
session.beginTransaction();
ben.setNickName(ben.getNickName() + "do sth_a");
session.getTransaction().commit();
session.close();
}
private class BranchThread implements Runnable {
public void run() {
synchronized (lock) {
try {
lock.wait(2*1000);//wait 2 seconds the ensure
// the main thread would read the dirt data.
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
lock.notifyAll();
Session session = HibernateSessionFactory.getSession();
User ben = (User) session.get(User.class, new Long(1));
session.beginTransaction();
ben.setNickName(ben.getNickName() + "do sth_b");
session.getTransaction().commit();
session.close();
}
}
public void start() {
new Thread(this).start();
}
}
典型的更新丢失问题,当然这是利用synchronized模拟的极端情况,但极端情况并不代表不发生。解决方案之一是加入乐观锁。具体操作过程如下:
entity加入一个数字类型属性,该属性与业务逻辑无关,被hibernate用作版本戳,具体如下:
private Integer version = new Integer(0);
重新配置hbm.xml文件,将该字段应慎到数据库中
<id name="oid" type="long">
<generator class="native" />
</id>
<version name="version" type="int" />
配置之后在执行上述语句会抛出:org.hibernate.StaleObjectStateException
参考文章:
http://www.360doc.com/showWeb/0/0/415808.aspx
http://www.360doc.com/showWeb/0/0/415808.aspx
以上属于乐观锁解决方案,还可以考虑悲观所解决方案;但悲观所解决方案需要一个与数据库的常链接,所以我认为,作为b/s项目,利用悲观所解决并发问题是不合理的,因为你无法保证一个常连接。
分享到:
相关推荐
通过实验,我们将学习如何配置Hibernate、创建实体类、编写映射文件以及执行基本的CRUD操作。 首先,让我们了解Hibernate的核心概念。Hibernate是一种开源的ORM框架,它通过XML或注解方式将Java对象映射到关系型...
在此背景下,《很不错的Hibernate解决方案》一文介绍了一种基于Hibernate框架的物流系统持久层解决方案,旨在解决当前物流系统中存在的问题,并提升整体性能。 #### Hibernate框架简介 Hibernate是一种开放源代码的...
未来 Hibernate是一个强大的Java持久化框架...以上各点提供了实现这一目标的基础,但实际项目中可能还需要解决更多特定于数据库的问题。通过良好的设计和测试,可以确保Hibernate应用程序在多种数据库环境下稳定运行。
Hibernate 锁机制_悲观锁和乐观锁 Hibernate 锁机制是指在数据库访问中,为了维护数据的一致性和正确性,所采取的一些机制来防止数据的并发访问和修改。 Hibernate 中有两种锁机制:悲观锁和乐观锁。 一、悲观锁...
Hibernate 实验手册 Hibernate 是一个基于 Java 的持久化框架,提供了一个简单的方式来将 Java 对象持久化到关系数据库中。下面是 Hibernate 实验手册的详细介绍: 1. 创建数据库和表 在实验中,我们首先创建了...
### Hibernate的乐观锁和悲观锁 #### 一、引言 在软件开发中,尤其是在涉及大量并发操作的应用场景下,确保数据的一致性和完整性是非常重要的。对于基于Java Web的应用而言,Hibernate作为一款流行的ORM框架,提供...
【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...
在进行Hibernate的测试时,可以创建一个名为`hibernate_test`的项目,编写对应的实体类、映射文件以及测试用例,模拟并发场景,来深入理解并对比悲观锁和乐观锁的差异和效果。 总之,理解并合理运用悲观锁和乐观锁...
掌握Hibernate的基本功能和基本用法 通过Hibernate将一个Java对象插入到数据库表中 (1) Hibernate是一个面向Java环境的对象/关系数据库映射工具,Hibernate不仅管理Java类型到数据库表的映射,还提供查询数据和...
### Hibernate中文问题解决方案 在开发基于Java的应用程序时,Hibernate作为一个强大的对象关系映射(ORM)框架被广泛采用。然而,在处理中文字符时,开发者可能会遇到各种各样的问题,如乱码显示等。本文将详细...
### Hibernate常见错误解决方案 在开发基于Hibernate框架的应用程序时,我们经常会遇到各种各样的异常情况。这些异常不仅会影响系统的正常运行,还可能增加调试难度。本文将针对几个常见的Hibernate异常进行详细...
总的来说,虽然ORM框架在处理大数据时可能存在性能挑战,但通过合理配置和使用批处理、游标滚动以及适时的缓存管理,我们可以克服这些挑战,使Hibernate在批量数据处理中发挥高效的作用。在实际项目中,还应结合...
本文主要讨论的是Hibernate框架中两种锁机制的使用:乐观锁和悲观锁。 首先,让我们深入理解悲观锁(Pessimistic Locking)。悲观锁正如其名字所示,假设并发环境中数据会被频繁修改,所以在整个数据处理过程中,它...
Hibernate封装了很多有用的API给开发者,降低了操作数据库的难度和复杂度,同时也减少了模板代码的数量,但Hibernate留给开发者可操作的空间相对Mybatis少了很多。 Mybatis框架使用起来很灵活,开发者可以自定义查询...
本文将详细介绍这两种锁的原理、应用场景以及如何在Hibernate中实现。 #### 二、悲观锁(Pessimistic Locking) ##### 2.1 定义 悲观锁是一种较为传统的锁机制,它假定并发冲突的可能性很高,因此在整个数据处理...
总结起来,这个多数据库解决方案利用Spring的IoC容器管理和配置了多个数据源,同时结合Hibernate提供了ORM功能。通过`OpenSessionInView`模式,确保了Web请求中的持久化操作能在合适的Session上下文中进行。这样的...
在分页解决方案中,Spring可以帮助管理Bean的生命周期,以及协调Struts和Hibernate之间的通信。 3. **Hibernate框架**:Hibernate是一个对象关系映射(ORM)工具,它允许开发者使用Java对象来操作数据库记录,简化...
【JavaEE实验五:大学本科生Hibernate】实验主要目标在于让学生掌握Hibernate开发环境的搭建,理解ORM框架的概念,以及深入理解Hibernate映射文件和配置文件的使用。Hibernate是一个强大的ORM(对象关系映射)框架,...