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.pswp.cn/news/370565.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370565.shtml
英文地址,請注明出處:http://en.pswp.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> 元素…