1.
hibernate基于数据版本(Version)记录机制实现。为数据增加一个版本标识,一般是通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
2. 例子:
//$Id: Conductor.java 11282 2007-03-14 22:05:59Z epbernard $
package org.hibernate.test.annotations.various;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Version;
import org.hibernate.annotations.Index;
import org.hibernate.annotations.OptimisticLock;
/**
* @author Emmanuel Bernard
*/
@Entity
public class Conductor {
@Id
@GeneratedValue
private Integer id;
@Column(name = "cond_name")
@Index(name = "cond_name")
//@OptimisticLock(excluded = true)
private String name;
@Column(name = "cond_address")
@Index(name = "cond_address")
@OptimisticLock(excluded = true)
private String address;
@Version
private Long version;
}
address是本人加上的.同时省略了get set方法.
测试:
//$Id: IndexTest.java 11282 2007-03-14 22:05:59Z epbernard $
package org.hibernate.test.annotations.various;
...........................
/**
* @author Emmanuel Bernard
*/
public class IndexTest extends TestCase {
...............
@SuppressWarnings("unchecked")
public void testVersion() throws Exception {
Session session1=openSession();
Session session2=openSession();
Conductor stu1=(Conductor)session1.createQuery("from Conductor as a where a.name='Bob'").uniqueResult();
Conductor stu2=(Conductor)session2.createQuery("from Conductor as a where a.name='Bob'").uniqueResult();
//这时候,两个版本号是相同的
System.out.println("v1="+stu1.getVersion()+"--v2="+stu2.getVersion());
Transaction tx1=session1.beginTransaction();
stu1.setName("session1");
tx1.commit();
//这时候,两个版本号是不同的,其中一个的版本号递增了
System.out.println("v1="+stu1.getVersion()+"--v2="+stu2.getVersion());
Transaction tx2=session2.beginTransaction();
stu2.setName("session2");
tx2.rollback();
session2.close();
session1.close();
}
............
}
添加testVersion方法。
分享到:
相关推荐
【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...
接下来是乐观锁(Optimistic Locking)。与悲观锁不同,乐观锁假设并发环境下数据不会被同时修改,因此在读取数据时不会立即加锁。只有在更新数据时,才会检查数据是否自上次读取后发生了变化。在Hibernate中,通常...
#### 三、乐观锁(Optimistic Locking) ##### 3.1 定义 乐观锁基于一种假设:大多数并发操作都不会引起冲突。它通过比较数据版本号(或最后一次修改时间戳)等方式来判断数据是否被修改,从而决定是否需要回滚事务...
#### 三、乐观锁(Optimistic Locking) 乐观锁则假设数据不会被外部修改,因此不会主动锁定数据,而是在提交事务时检查数据是否被其他事务修改过。这种机制减少了锁的竞争,从而提高了系统的并发能力。乐观锁通常...
二、乐观锁(Optimistic Locking) 乐观锁是一种乐观的认为资料的存取很少发生同时存取的问题,不作数据库层次上的锁定,而是通过应用程序上的逻辑实现版本控制的方法来维护正确的数据。 在 Hibernate 中,乐观锁...
#### 二、乐观锁(Optimistic Locking) 乐观锁与悲观锁相反,它假定数据不太可能被其他线程或进程修改,因此不会一开始就锁定数据。这种锁机制通常不会直接使用数据库级别的锁定机制,而是通过版本号或其他标记来...
4. **乐观锁(Optimistic Locking)**: 乐观锁是一种非阻塞的并发控制策略,假设并发情况下冲突较少。Hibernate通过版本号或时间戳实现乐观锁,即在实体类中添加一个版本字段,并在更新时检查版本是否一致。如果...
`hibernate_optimistic_locking`文件可能讨论了Hibernate的乐观锁机制。乐观锁在读取数据时不加锁,而在更新时检查数据是否被其他事务修改,如果发现有冲突,则回滚事务。通过版本号或时间戳等方式实现,适合读多写...
`hibernate_lazy_for_single_end`和`hibernate_optimistic_locking`涉及到对象状态管理和并发控制。懒加载是一种优化策略,仅在需要时才加载关联对象。乐观锁则是并发控制的一种方法,它假设在大多数情况下不会发生...
乐观锁(Optimistic Locking)是一种并发控制机制,主要用于多用户环境下数据库记录的并发操作控制。与悲观锁(Pessimistic Locking)相比,乐观锁假设多个事务在处理数据时不会发生冲突,只有在事务提交时,才通过...
此外,还会讨论乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)的实现方法。 除此之外,文档还会介绍第二级缓存(Second Level Cache)和查询缓存(Query Cache),这两种缓存机制能显著提升应用程序...
同时,也会讨论乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)的使用场景和实现方法。 查询是Hibernate的重要功能,手册会详细讲解HQL和Criteria API的用法。HQL类似于SQL,但更为面向对象,可以...
这个异常通常在乐观锁(Optimistic Locking)机制失败时抛出,意味着在数据库操作过程中,数据的版本信息(version)与预期不符,即在读取和更新之间,数据已被其他事务修改。 乐观锁是一种并发控制策略,它假设在...
1. **乐观锁(Optimistic Locking)**:假设数据不会经常冲突,只有在提交时才会进行冲突检测。Hibernate 通过版本字段实现自动乐观并发控制。 2. **悲观锁(Pessimistic Locking)**:假设数据冲突很常见,因此在数据...
乐观锁是Hibernate提供的并发控制策略之一。在这里,我们将了解如何使用版本字段或时间戳来防止数据的脏读、不可重复读和幻读,以及如何处理乐观锁冲突。 4. **Chapter 21 - Struts2 First**: 本章节结合Struts2...
14. **版本控制(Optimistic Locking/Pessimistic Locking)**:Hibernate提供乐观锁和悲观锁来防止并发访问时的数据冲突。 15. **事件监听器**:可以通过实现特定接口或使用注解来监听持久化过程中的各种事件,如...
除了`@Version`,Hibernate还提供了其他方式来实现并发控制,如`@OptimisticLocking`注解,可以自定义乐观锁的字段。另外,悲观锁可以通过`@Lock`注解实现,它在查询时就锁定数据,确保其他事务不能修改。 在实际...