文档章节

JPA/Hibernate:基于版本的乐观锁并发控制

秦学强
 秦学强
发布于 2017/07/09 22:04
字数 510
阅读 3
收藏 0

比方说,我们有一个系统由多个用户使用,其中每个实体可以被多个用户修改。我们希望避免这种情况:两个人的加载一些信息,基于他们所看到的做出一些决定,然后在相同的时间。更新状态,我们不让让后一个用户覆盖前面一个用户做出的修改。

  它也可以发生在服务器环境 - 多个事务可以修改共享的实体:

  1. 事务1加载数据
  2. 事务2更新数据,并确认
  3. 事务1基于第一步加载的数据(不是当前最新数据,最新数据已经被事务2修改过),执行某些计算并更新状态,

  解决办法使用@Version 如下:

@Entity
@Table(name = 'orders')
public class Order {
       @Id
       private long id;

       @Version
       private int version;

       private String description;

       private String status;

       // ... mutators
}

当这个实体被持久化时,version被设置为开始值。

只要它被更新,hibernate总是执行:

update orders  set description=?, status=?, version=?  where id=? and version=?

我们结合GUI来看一下执行顺序。

update orders
set description=?, status=?, version=2
where id=? and version=1

更新订单时, version被设置为2了。而同时另外一个version是1的用户也开始更新订单了:

update orders
set description=?, status=?, version=2
where id=? and version=1

这个更新无用,因为version已经变成了2. Hibernate会发现,抛出: org.hibernate.StaleObjectStateException

第二个用户看到这种出错,再也不能操作了,除非重新刷新页面。获取最新被修改的值。

优点:

  1. 它提供了一个方便,以自动化的方式来保持一致性,像上述的案例。这意味着,每一个动作只能执行一次,它保证用户或服务器过程中看到的是最新状态。
  2. 它需要很少的工作来设置。
  3. 由于其乐观的天性,速度非常快。没有锁定的任何地方,只是多了一个字段添加到查询中。

本文转载自:http://blog.csdn.net/u014481096/article/details/60576585

共有 人打赏支持
秦学强

秦学强

粉丝 0
博文 69
码字总数 0
作品 0
海淀
程序员
私信 提问
利用 JPA 2.0 二级缓存实现高速数据访问

JPA 是 Java Persistence API 的简称,JPA 1.0 目前只支持一级缓存。JPA 2.0 在 2009 年 12 月发布,作为 Java 6 的标准,JPA 2.0 增加了对二级缓存的支持。WebSphere Application Server V7...

IBMdW
2011/06/10
2K
0
技术专题讨论:如何对 JPA 或者 MyBatis 进行技术选型

在我们平时的项目中,大家都知道可以使用 JPA 或者 Mybatis 作为 ORM 层。对 JPA 和 Mybatis 如何进行技术选型? 下面看看大精华总结如下: 最佳回答 首先表达个人观点,JPA必然是首选的。 ...

后海
06/27
0
0
Java新手如何学习Spring、Struts、Hibernate三大框架?

ava三大框架的各自作用 一、Spring Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。 Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spr...

懿涌
2017/06/02
683
9
SSH与SSH2这种框架组合的历史原由

早在2001年时当时的J2EE推崇的是EJB,EJB被称为J2EE的核心,当时要学J2EE就是Servlet+EJB,在EJB里其实早已经有了AOP与实体映射这些概念了。 EJB有三种形态的BEAN,SessionBean, Entity Bea...

天行健J
2012/11/20
0
0
Spring Data JPA实战视频教程

Spring Data JPA实战视频教程 视频大纲 JPA入门 Spring Data JPA入门 Repository的定义 查询方法的命名策略 JPQL查询,结果映射 Named Query,Named Native Query 排序,分页 JPA Criteria查...

刘宗泽
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

序列化与反序列化实现

一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象序列化之后得到的字节序列,主要有两种用途:   1) 把对...

狼王黄师傅
20分钟前
0
0
Spring boot 各种常用注解总结(不断完善中)

@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。 @Scope注解 作用域 @Lazy(true) 表示延迟初始化 @Service用于标注业务层组件、...

覃大光
22分钟前
2
1
《让家庭教育回归生活》读书笔记3000字范文

《让家庭教育回归生活》读书笔记3000字范文: 以前,只知道新东方是教英语的,也培训挖掘机司机,一直不知道他们还研究家庭教育。读了《让家庭教育回归生活》一书,才知道他们的家庭教育高峰...

原创小博客
34分钟前
3
0
spring学习笔记(二)spring 事件的使用

spring 中的事件 spring事件通过订阅发布 可以解耦操作 可以同步 可以异步 步骤 编写事件 通过继承org.springframework.context.ApplicationEvent 来编写事件 public ApplicationEvent(Obj...

NotFound403
昨天
15
0
特斯拉车主成功破解了自己Model 3汽车

据汽车博客Electrek消息,一位特斯拉车主成功破解了自己Model 3汽车,还在此基础上运行了Ubuntu。 这位叫trsohmers的网友表示,“功劳大多要归到Ingineerix的头上,他花了数月才找到初始的那...

linuxCool
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部