文档章节

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
海淀
程序员
Java EE开发三剑客发展现状以及发展浅析

JSF 2.0 尽管 Java 在展示层框架上竞争的非常激烈,但 JSF 仍然固守着自己的领地。虽然有很多关于 JSF 的易用性和健壮性的质疑声,但 JSF2.0 就是为正面解决这些问题而提出来的,它的易用,创...

晨曦之光
2012/03/09
0
0
技术专题讨论:如何对 JPA 或者 MyBatis 进行技术选型

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

后海
06/27
0
0
Java EE 6体系结构的变革

尽管 Java 在展示层框架上竞争的非常激烈,但 JSF 仍然固守着自己的领地。虽然有很多关于 JSF 的易用性和健壮性的质疑声,但 JSF2.0 就是为正面解决这些问题而提出来的,它的易用,创新以及可...

晨曦之光
2012/03/09
0
0
spring data jpa 详解

本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求。这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring整合的环境中实现...

无敌小学僧
05/30
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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
0
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
2
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部