`

Hibernate 乐观锁(Optimistic Locking)

    博客分类:
  • java
阅读更多

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乐观锁和悲观锁学习

    其中通过 version 实现的乐观锁机制是 Hibernate 官方推荐的乐观锁实现,同时也是 Hibernate 中,目前唯一在数据对象脱离 Session 发生修改的情况下依然有效的锁机制。因此,一般情况下,我们都选择 version 方式...

    Optimistic Locking with Concurrency in Oracle

    NULL 博文链接:https://huanyue.iteye.com/blog/2047294

    gorm-optimistic:这是一个基于GORM的乐观锁插件

    Gorm乐观锁 这是一个基于的乐观锁插件。 快速开始 func BenchmarkUpdateWithOptimistic ( b * testing. B ) { dsn := "root:abc123@/test?charset=utf8&parseTime=True&loc=Local" db , err := gorm . Open ( ...

    optimistic-locking-behavior:允许您在 Propel 2 中使用乐观锁的行为

    乐观锁定行为Propel2 的乐观锁定行为。... behavior name = " optimistic_locking " /></ table> 如果你还没有通过 composer 安装这个行为,你需要指定完整的类名作为行为名: < behavior name = " \MJS\Opti

    解決 SQL Server & Hibernate 一起使用,造成死結問題

    This is a bit like the way Hibernate uses optimistic locking for versioned objects. The benefit is that lock contention is totally removed because there aren’t any locks on rows! This means that ...

    OptimisticLock:CakePHP 行为插件为 RDBMS 实现乐观锁

    乐观锁CakePHP 行为插件为 RDBMS 实现乐观锁定。用法最简单的是,只需在您的模型中加载此行为。 class Post extends AppModel {public $ actsAs = array ( 'OptimisticLock.OptimisticLock' );} 您可以指定要比较的...

    hibernate学习笔记

    乐观锁(hibernate_optimistic) 32 HQL查询(hibernate_hql) 34 补充:SQL join连接 40 缓存 44 一级缓存 44 快取 45 hibernate二级缓存 47 Hibernate Gossip: 二级快取(Second-level) 48 hibernate查询缓存 50 ...

    spring-data-jpa-locking:使用javax.persistance批注测试OptimisticLocking和PessimisticLocking的Spring Data JPA示例

    通过使用批注测试OptimisticLock和PessimisticLocking的Spring Data JPA示例。 经过Oracle 12数据库测试 技术堆栈: Java 1.8+ Maven 3.6+ Spring Boot 2.4.2.RELEASE Oracle for Java数据库驱动程序ojdbc8 ...

    On Optimistic Methods for Concurrency Control.pdf

    乐观锁协议

    Hibernate+中文文档

    11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 ...

    hibernate3.2中文文档(chm格式)

    11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 ...

    HibernateAPI中文版.chm

    11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 ...

    Hibernate注释大全收藏

    @Version 注解用于支持乐观锁版本控制。 @Entity public class Flight implements Serializable { ... @Version @Column(name="OPTLOCK") public Integer getVersion() { ... } } version属性映射到 "OPTLOCK...

    hibernate 教程

    乐观并发控制(Optimistic concurrency control) 10.4.1. 使用长生命周期带有自动版本化的会话 10.4.2. 使用带有自动版本化的多个会话 10.4.3. 应用程序自己进行版本检查 10.5. 会话断开连接(Session...

    Hibernate中文详细学习文档

    11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 ...

    Hibernate 中文 html 帮助文档

    11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 ...

    最全Hibernate 参考文档

    11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 长生命周期session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 ...

    hibernate 体系结构与配置 参考文档(html)

    乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 ...

    Hibernate教程

    12.3. 乐观并发控制(Optimistic concurrency control) 12.3.1. 应用程序级别的版本检查(Application version checking) 12.3.2. 长生命周期session和自动版本化 12.3.3. 脱管对象(deatched object)和自动版本化 ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 ...

Global site tag (gtag.js) - Google Analytics