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

本文是Hibernate和JPA中基于版本的乐观并发控制的简介。 这个概念已经很老了,上面已经写了很多东西,但是无论如何我都看到了它被重新发明,误解和滥用。 我在编写它只是为了传播知识,并希望引起人们对并发控制和锁定的兴趣。

用例

假设我们有一个供多个用户使用的系统,其中每个实体可以由多个用户修改。 我们希望避免两个人加载一些信息,根据他们看到的内容做出一些决定并同时更新状态的情况。 我们不希望丢失在第一个交易中首先单击“保存”的用户通过覆盖它们所做的更改。

它也可能在服务器环境中发生–多个事务可以修改共享实体,我们希望避免出现以下情况:

  1. 交易1载入资料
  2. 事务2更新该数据并提交
  3. 使用在步骤1中加载的状态(不再是当前状态),事务1执行一些计算并更新状态

在某些方面,它与不可重复的读取具有可比性。

解决方案:版本控制

因此,Hibernate和JPA实现了基于版本的并发控制的概念。 运作方式如下。

您可以使用@Version<version> (数字或时间戳)标记一个简单的属性。 这将是数据库中的特殊列。 我们的映射如下所示:

@Entity
@Table(name = 'orders')
public class Order {@Idprivate long id;@Versionprivate int version;private String description;private String status;// ... mutators
}

当这样的实体持续存在时,version属性将设置为起始值。

每当更新时,Hibernate都会执行如下查询:

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

请注意,在最后一行, WHERE子句现在包括version 。 此值始终设置为“旧”值,因此只有在具有预期版本的情况下,它才会更新行。

假设有两个用户在版本1中加载订单,并花一些时间在GUI中查看订单。

安妮决定批准该订单并执行该操作。 数据库中的状态已更新,一切正常。 传递给update语句的版本如下:

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

如您所见,在持久化更新持久层时,版本计数器将增加到2。

在她的GUI中,Betty仍然具有旧版本(编号1)。 当她决定对订单执行更新时,该语句如下所示:

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

此时,在Anne的更新之后,数据库中该行的版本为2。因此,第二次更新影响0行(没有与WHERE子句匹配的行)。 Hibernate会检测到它,并检测到一个org.hibernate.StaleObjectStateException (包装在javax.persistence.OptimisticLockException )。

结果,第二个用户除非刷新视图,否则无法执行任何更新。 为了获得适当的用户体验,我们需要进行一些干净的异常处理,但是我将省略。

组态

这里几乎没有要自定义的内容。 @Version属性可以是数字或时间戳。 数字是人为的,但通常在内存和数据库中占用较少的字节。 时间戳较大,但始终会更新为“当前时间戳”,因此您可以实际使用它来确定实体的更新时间。

为什么?

那为什么要使用它呢?

  • 它提供了一种方便且自动化的方式来维持上述情况下的一致性。 这意味着每个动作只能执行一次,并且可以确保用户或服务器进程在制定业务决策时看到最新状态。
  • 设置只需很少的工作。
  • 由于其乐观的性质,因此速度很快。 在任何地方都没有锁定,只有一个字段添加到同一查询中。
  • 在某种程度上,即使在已提交读事务隔离级别的情况下,它也可以确保可重复读。 它将以一个异常结束,但是至少不可能创建不一致的状态。
  • 它适用于非常长的对话,包括跨越多个事务的对话。
  • 在ACID数据库上的所有可能情况和竞争条件下,它都是完全一致的。 更新必须是顺序更新,更新涉及行锁定,而“第二”更新将始终影响0行并失败。


演示版

为了演示这一点,我创建了一个非常简单的Web应用程序。 它将Spring和Hibernate连接在一起(在JPA API后面),但是它也可以在其他设置中工作:Pure Hibernate(无JPA),具有不同实现的JPA,非webapp,非Spring等。

该应用程序保留一个具有与上述类似的架构的Order ,并以Web表单显示该Order ,您可以在其中更新描述和状态。 要尝试并发控制,请在两个选项卡中打开页面,进行不同的修改并保存。 不使用@Version尝试相同的@Version

它使用嵌入式数据库,因此需要最少的设置(仅Web容器),并且只需重新启动即可从新数据库开始。

这非常简单-在@Transactional @Controller访问EntityManager并直接使用JPA映射的实体支持表单。 对于不太琐碎的项目而言,这可能不是最好的处理方法,但是至少它将所有代码集中在一个地方并且非常容易掌握。

可以在我的GitHub存储库中找到Eclipse项目的完整源代码。

参考: 在我们的JCG合作伙伴 Konrad Garus的Squirrel博客上,JPA / Hibernate中基于版本的乐观并发控制 。

翻译自: https://www.javacodegeeks.com/2012/11/jpahibernate-version-based-optimistic-concurrency-control.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高可用集群搭建

高可用集群搭建  创建hadoop账户 创建hadoop账户&#xff08;#注意&#xff0c;接下来的操作均在hadoop账户下运行&#xff09; # useradd hadoop # passwd hadoopsu - hadoopmkdir soft disk1 disk2mkdir -p disk{1,2}/dfs/{dn,nn}mkdir -p disk{1,2}/nodemgr/local 将本地目…

scrt如何切换成英文版_英文版SecureCRT显示乱码解决

英文版SecureCRT显示乱码解决系统环境&#xff1a;CentOS&#xff15;.&#xff16;以前Linux都是默认安装在英文环境下&#xff0c;用英文版的SecureCRT查看系统内容输出的也都是英文的&#xff0c;不会出现乱码问题。今天同事在服务器安装时默认选择了简体中文&#xff0c;这…

java try catch_Java捕获异常

大家好&#xff0c;欢迎来到乐字节小乐的Java技术分享园地在Java中&#xff0c;凡是可能抛出异常的语句&#xff0c;都可以用try ... catch捕获。把可能发生异常的语句放在try { ... }中&#xff0c;然后使用catch捕获对应的Exception及其子类。多catch语句可以使用多个catch语…

haproxy文件操作

import os #导入os模块def search(): #定义查找函数 with open(haproxy.txt,r) as f: #只读方式打开文件 value input(请输入您…

多语言持久性:带有MongoDB和Derby的EclipseLink

从现在开始&#xff0c;多语种持久性一直是新闻。 从2011年底开始&#xff0c;在著名的Fowler帖子的推动下&#xff0c;我看到了更多更好的主意。 最新的一个是公司内部的学生项目&#xff0c;我们在其中使用Scala作为后端数据&#xff0c;将数据持久存储到MongoDB&#xff0c;…

web前端开发最佳实践--(笔记之JavaScript最佳实践)

如何避免全局变量污染&#xff1f; 避免定义全局变量或全局函数用一个变量进行封装&#xff0c;并返回外部需要访问的接口如何写出高维护的js代码 配置数据和代码逻辑分离 如&#xff1a; 改成&#xff1a; ---用js模板mustachehandlebarsjsMVC的数据模式 model&#xff1a;数据…

yum mysql5.7位置_CentOS yum 安装 Mysql5.7

1 Steps for a Fresh Installation of MySQL# wget https://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm# yum localinstall mysql57-community-release-el6-9.noarch.rpm以上步骤其实是把 MySQL Yum repository 添加到了系统的 repository list 里去了。ll…

HTML/CSS基础知识(四)

WEB标准和W3C的理解与认识 Web标准是一系列标准的集合。 网页主要由三部分组成&#xff1a;结构&#xff08;Structure&#xff09;、表现&#xff08;Presentation&#xff09;和行为&#xff08;Behavior&#xff09;。 对应的标准也分三方面&#xff1a;结构化标准语言主要包…

python做一个系统代码_python初学者,用python3实现基本的学生管理系统代码实例...

这篇文章分享了管理系统&#xff0c;python学生管理系统的使用&#xff0c;这篇文章非常详细地介绍了通过示例代码实现的学生管理系统&#xff0c;该系统对每个人的研究或工作都有一定的参考学习价值。 这个是用python实现的基本的增删改查的学生管理系统吧&#xff0c;其中主要…

Python入门笔记

Python变量和数据类型 数据类型 print语句 注释 Python的注释以 # 开头&#xff0c;后面的文字直到行尾都算注释 # 这一行全部都是注释... print hello # 这也是注释 什么是变量 定义字符串 字符串可以用或者""括起来表示。 如果字符串本身包含怎么办&#xff1f;比如…

1058. 选择题(20)

原题: https://www.patest.cn/contests/pat-b-practise/1058 思路: 本题主要就是怎么读取数据的问题, 一定要注意scanf函数匹配到 空格或者回车会结束当前变量的赋值, 并且会丢弃这个空格或回车. 关于如何判断一项答题是否正确, 可以采用循环一个一个判断, 也可拼成 字符串用st…

使用Spring和Hibernate进行集成测试有多酷

我有罪&#xff0c;直到现在才写集成测试&#xff08;至少针对数据库相关事务&#xff09;。 因此&#xff0c;为了消除内感&#xff0c;我阅读了如何在周末以最少的努力实现这一目标。 提供了一个小示例&#xff0c;描述了如何使用Spring和Hibernate轻松实现这一目标。 通过集…

假设mysql数据表t1有字段_使用ROMA Connect集成数据

概述ROMA Connect支持接入多种类型的数据源&#xff0c;并通过数据集成任务实现源端到目标端的数据集成转换。ROMA Connect支持相同结构数据之间进行集成转换&#xff0c;也支持异构数据之间进行集成转换。本章节通过完成一个SQL Server到MySQL的数据集成配置样例&#xff0c;帮…

vue-wechat-title

html中的title安装&#xff1a;npm install vue-wechat-title --save1.在mian.js中//网页titleimport VueTitle from vue-wechat-title Vue.use(VueTitle);2. 路由中加下 title { path: /, component: Index, meta: { title: 首页 } }3. 在app.vue 中修改 router-view &a…

如何保证input的输入值不会随着提交 而变空_如何对web界面的应用进行测试?

一、输入框&#xff1a;1、字符型输入框&#xff1a;&#xff08;1&#xff09;字符型输入框&#xff1a;英文全角、英文半角、数字、空或者空格、特殊字符“~&#xff01;#&#xffe5;%……&*&#xff1f;[]{}”特别要注意单引号和&符号。禁止直接输入特殊字符时&…

CentOS6.x下,tomcat - web项目部署

1. 安装tomcat tomcat安装方法&#xff1a;http://www.cnblogs.com/vurtne-lu/p/6478440.html 2. 配置tomcat 修改server.xml文件 <!-- 使用 80 端口 (也可以使用其它端口)--> <Connector port"80" protocol"HTTP/1.1"connectionTimeout"200…

dedecms列表页面随机缩略图调用

如果要利用dedecms制作扁平化主题&#xff0c;大概也能够遇到相似的问题&#xff0c;那就是dedecms的缩略图机制&#xff0c;在没有缩略图的情况下显示单一的默认图片&#xff0c;如果是wordpress可以很方便的定义函数调用随机的缩略图&#xff0c;即便是在没有设置缩略图并且文…

使用地图触发功能处理相干事件

本文介绍如何通过使用映射触发器来处理一致性事件。 基本上&#xff0c;建议使用Oracle Coherence中的分布式数据管理来研究Oracle Coherence API的基本配置和实现。 映射触发器是Oracle Coherence提供最高度定制的缓存管理系统的最重要功能之一。 MapTrigger代表一个功能代理…

阿里云服务器mysql莫名丢失_mysql数据库丢失

mysql数据库丢失云服务器(Elastic Compute Service&#xff0c;简称ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备&#xff0c;让您像使用水、电、天然气等公共资源一样便捷、高…

01-HTML深入

1.1 浏览器的工作原理 把一些标签解析成用户可视化的页面 1.2 HTML中的标签与元素 在HTML中以<xx>开始&#xff0c;以</xx>结束&#xff0c;比如<html></html>等。 标签和其内容统称为元素&#xff0c;比如&#xff1a;<xx>h5</xx> 元素…