1. 如何支持this.sessionFactory.getCurrentSession()
在SessionFactory 的配置中
<property name="hibernateProperties">
<props>
<prop key="hibernate.current_session_context_class">
thred
</prop>
<prop key="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</prop>
</props>
</property>
添加此配置后,必须在code中使用transaction
public List<LogEntry> getAll(){
Transaction transaction=this.sessionFactory.getCurrentSession().beginTransaction();
try{
return this.sessionFactory.getCurrentSession().createQuery("from LogEntry").list();
}finally{
transaction.commit();
}
}
public List<LogEntry> getByName(String name){
Transaction transaction=this.sessionFactory.getCurrentSession().beginTransaction();
try{
return this.sessionFactory.getCurrentSession().createQuery("from LogEntry where name=:name").setParameter
("name",name).uniqueResult();
}finally{
transaction.commit();
}
}
2. 线程A 和 B 各从数据库中加载同一行数据,线程A先更新数据,保存,然后线程B更新数据,这时就会有脏数据产生.
悲观锁: 线程A可以整行加锁,从而使得只有A更新完数据,B才能从数据库中加载数据,此方法为悲观锁
乐观锁: 如果执行的读操作比写操作多,最好将行释放,使用乐观锁.
3. hibernate中乐观锁的实现:
在数据库表中增加一列 : version, default value : null , long
在HIBERNATE的*.hbm.xml文件中
................
<version name="version" column="version" unsave-value="null" type="long"
<property name="name" column="name" not-null="true"/>
...............
每做一次更新,version 会自动加1, 这样当线程A更新完后, version=version+1, 线程再更新时 version 会不同,会有异常抛出
4. 可以通过比较对象ID和 VERSION同时相等,来确认内存中的两个对象相等。
分享到:
相关推荐
在Hibernate中,悲观锁可以通过`Query.setLockMode()`或`Criteria.setLockMode()`方法设置锁模式。例如: ```java String hqlStr = "from TUser as user where user.name='Erica'"; Query query = session....
在Hibernate源码中,乐观锁的实现主要依赖于`AbstractEntityPersister`类的`checkOptimisticLocking()`方法,它会比较当前对象的版本信息与数据库中的版本信息,如果不同则抛出`StaleObjectStateException`异常。...
**Hibernate中的悲观锁实现**: 在Hibernate中,可以通过`Query.setLockMode()`方法来实现悲观锁。例如: ```java String hqlStr = "FROM TUser AS user WHERE user.name = 'Erica'"; Query query = session....
在悲观锁中,Hibernate提供了多种锁模式,如`LockMode.NONE`、`LockMode.WRITE`、`LockMode.READ`等,这些主要由内部使用。而`LockMode.UPGRADE`和`LockMode.UPGRADE_NOWAIT`(Oracle特有的)则是我们在应用程序中...
在Hibernate中,实现乐观锁的一种常见方式是通过版本字段(version field)来追踪数据的版本。当数据被读取时,版本字段会被一同获取;在更新时,Hibernate会将当前版本与数据库中的最新版本进行比较。如果两个版本...
Hibernate 中有两种锁机制:悲观锁和乐观锁。 一、悲观锁(Pessimistic Locking) 悲观锁是一种预防并发访问的机制,Hibernate 通过对数据库的锁定来实现。悲观锁假定任何时刻存取数据时,都可能有另一个客户也...
本文将详细介绍这两种锁的原理、应用场景以及如何在Hibernate中实现。 #### 二、悲观锁(Pessimistic Locking) ##### 2.1 定义 悲观锁是一种较为传统的锁机制,它假定并发冲突的可能性很高,因此在整个数据处理...
Hibernate推荐的乐观锁实现是通过在实体类中添加一个版本字段,每次数据更新时,若版本号与数据库中的版本号匹配,更新成功并递增版本号;若不匹配,则表示数据已被其他用户修改,更新操作将失败。这通常通过`...
在《hibernate_3200_Concurrency_Pessimistic_Lock》这个压缩包中,很可能包含了关于Hibernate框架如何实现悲观锁和乐观锁的详细资料,包括源代码示例、配置方法和使用场景。通过学习这些资料,你可以深入了解这两种...
在Java的持久化框架Hibernate中,悲观锁和乐观锁是两种重要的并发控制策略,它们用于管理数据库中的数据在多线程环境下的访问安全。本文将深入探讨这两种锁机制的原理、应用场景及其区别。 首先,我们来理解悲观锁...
乐观锁定版本控制:通过`@Version`注解,Hibernate可以实现乐观锁,防止并发更新时的数据冲突。 2.2.2. 映射简单属性和嵌入式对象:使用`@Column`注解映射简单属性,如字符串、整数等。`@Embeddable`和`@Embedded`...
还讨论了并发控制中的乐观锁和悲观锁。 JNDI和锁:JNDI(Java Naming and Directory Interface)用于在Java应用程序中访问命名和目录服务。锁部分则介绍了乐观锁和悲观锁的概念及其使用方法。 Fetching(抓取):...
### Hibernate中文参考文档知识点概述 ...通过以上对Hibernate知识点的详细介绍,可以帮助开发人员更好地理解和掌握其核心技术,从而在实际项目中更加高效地运用Hibernate解决复杂的数据库操作问题。
在Hibernate中,乐观锁的处理主要在`org.hibernate.event.internal.DefaultMergeEventListener`和`org.hibernate.event.internal.DefaultUpdateEventListener`这两个事件监听器中完成。当调用`Session.merge()`或`...
在Hibernate 5.0中,这个框架进一步提升了性能和易用性,引入了许多新的特性和改进。 文档首先会介绍Hibernate的基本概念,包括实体(Entity)、持久化(Persistence)、对象关系映射(ORM)以及Session和...
11. **事务与并发控制**:讨论Hibernate的事务管理,以及乐观锁、悲观锁等并发控制策略。 12. **事件监听与拦截器**:介绍如何使用事件监听器和拦截器进行自定义行为扩展。 13. **性能优化**:提供一些最佳实践和...
4. ** Hibernate锁的使用** - `Session.lock()`: 将对象锁定在指定的锁模式下。 - `Query.setLockMode()`: 对查询结果应用锁模式。 - `Criteria.setLockMode()`: 同上,针对Criteria查询。 5. **实验情况** - ...
标题中的“Hibernate 乐观和悲观锁”涉及到的是Java领域中持久化框架Hibernate中的一种数据并发控制策略。在多线程环境下,为了保证数据的一致性和完整性,数据库管理系统提供了多种锁定机制,其中乐观锁和悲观锁是...
《Hibernate4.1.11中文手册》是针对Java开发者的重要参考资料,它详细阐述了Hibernate框架在4.1.11版本中的各项功能和用法。Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程方式来...