hibernate 版本(version)控制

news/2024/7/3 6:48:48

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 Hibernate支持乐观锁。当多个事务同时对数据库表中的同一条数据操作时,如果没有加锁机制的话,就会产生脏数据(duty data)。Hibernate有2种机制可以解决这个问题:乐观锁和悲观锁。这里我们只讨论乐观锁。 
     Hibernate乐观锁,能自动检测多个事务对同一条数据进行的操作,并根据先胜原则,提交第一个事务,其他的事务提交时则抛出org.hibernate.StaleObjectStateException异常。 
    Hibernate乐观锁是怎么做到的呢? 
    我们先从Hibernate乐观锁的实现说起。要实现Hibenate乐观锁,我们首先要在数据库表里增加一个版本控制字段,字段名随意,比如就叫version,对应hibernate类型只能为 long,integer,short,timestamp,calendar,也就是只能为数字或timestamp类型。然后在hibernate mapping里作如下类似定义: 

    <version name="version" 
        column="VERSION" 
        type="integer"/> 

告诉Hibernate version作为版本控制用,交由它管理。 
当然在entity class里也需要给version加上定义,定义的方法跟其他字段完全一样。 
private Integer version; 
… 
// setVersion() && getVersion(Integer) 

Hibernate乐观锁的的使用: 
Session session1 = sessionFactory.openSession(); 
Session session2 = sessionFactory.openSession(); 
MyEntity et1 = session1.load(MyEntity.class, id); 
MyEntity et2 = session2.load(MyEntity.class, id); 
//这里 et1, et2为同一条数据 
Transaction tx1 = session1.beginTransaction(); 
//事务1开始 
et1.setName(“Entity1”); 
//事务1中对该数据修改 
tx1.commit(); 
session1.close(); 
//事务1提交 
Transaction tx2 = session2.beginTransaction(); 
//事务2开始 
et2.setName(“Entity2”); 
//事务2中对该数据修改 
tx2.commit(); 
session2.close(); 
//事务2提交 

在事务2提交时,因为它提交的数据比事务1提交后的数据旧,所以hibernate会抛出一个org.hibernate.StaleObjectStateException异常。 
回到前面的问题,Hibernate怎么知道事务2提交的数据比事务1提交后的数据旧呢? 
因为MyEntity有个version版本控制字段。 

回头看看上面的源代码中的: 
MyEntity et1 = session1.load(MyEntity.class, id); 
MyEntity et2 = session2.load(MyEntity.class, id); 
这里,et1.version==et2.version,比如此时version=1, 
当事务1提交后,该数据的版本控制字段version=version+1=2,而事务2提交时version=1<2所以Hibernate认为事务2提交的数据为过时数据,抛出异常。 
这就是Hibernate乐观锁的原理机制。 
我们已经知道了Hibernate乐观锁是根据version的值来判断数据是否过时,也就是说,在向数据库update某数据时,必须保证该entity 里的version字段被正确地设置为update之前的值,否则hibernate乐观锁机制将无法根据version作出正确的判断。 
在我们的WEB应用中,尤其应该注意这个问题。

转载于:https://my.oschina.net/airship/blog/829622


http://www.niftyadmin.cn/n/2776866.html

相关文章

Eclipse如何debug调试jdk源码,并显示局部变量值

Eclipse调试jdk源码&#xff0c;参考&#xff1a; http://blog.csdn.net/xuefeng0707/article/details/8738869 显示局部变量值&#xff0c;参考&#xff1a; http://blog.csdn.net/leehsiao/article/details/50562871 其实&#xff0c;我在调试jdk源码时出现了上述参考都解…

java类放入集合为什么重写equals和hashcode实现serializable(转)

在Java语言中&#xff0c;equals()和hashCode()两个函数的使用是紧密配合的&#xff0c;你要是自己设计其中一个&#xff0c;就要设计另外一个。在多数情况下&#xff0c;这两个函数是不用考虑的&#xff0c;直接使用它们的默认设计就可以了。但是在一些情况下&#xff0c;这两…

各类***需要开放的端口及协议

PPTP端口&#xff1a;TCP: 1723 GRE协议 ——————————— L2TP ——————————— UDP:500 (isakmp) UDP:4500 (nat-t) UDP:1701 (l2tp)转载于:https://blog.51cto.com/richylu/1894031

kylin的状态栏(启动器)改成ubuntu之前的样子

ylin的状态栏&#xff08;启动器&#xff09;改成ubuntu之前的样子&#xff0c;ubuntu是在左边的&#xff0c;kylin在底部。占空间。 执行命令 gsettings set com.canonical.Unity.Launcher launcher-position Left 启动器放在左边&#xff0c;屏幕空间更大些。 放底部 gsettin…

springdatajpa命名规则_Spring data jpa Entity实体类命名规范

代码布局使用Spring Data Jpa 框架操作MySql数据库时&#xff0c;写了一个Blog实体类&#xff0c;属性如下&#xff1a;Entitypublic class Blog {IdGeneratedValue(strategy GenerationType.AUTO)private Long id;private String title;private String content;Temporal(Tempo…

hadoop2.6.0理论:hdfs、yarn、mapreduce的架构

HDFS2的架构&#xff1a;负责数据的分布式存储 主从结构 主节点&#xff0c;可以有2个: namenode 从节点&#xff0c;有很多个: datanode namenode负责&#xff1a; 接收用户操作请求&#xff0c;是用户操作的入口 维护文件系统的目录结构&#xff0c;称作命名空间…

Scala知识图谱

2019独角兽企业重金招聘Python工程师标准>>> 环境搭建 在SBT的项目中使用scala console&#xff1a;在平时学习、表达式时&#xff0c;不方便调用的大型的intellij&#xff0c;如果直接使用scala&#xff0c;不能调用前期下载的库。这是可以使用 sbt console** 使用…

java 8 排序_Java 八大排序实现

参考链接本文只给出算法的Java实现版本&#xff0c;具体原理参考&#xff1a;八大排序算法。公用代码下面的swap()函数&#xff0c;是排序算法中经常用到的&#xff0c;单独贴出来。public void swap(int[] a, int i, int j) {int tmp a[i];a[i] a[j];a[j] tmp;}冒泡排序/**…