精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Web應用中并發控制的實現

開發 前端
Web應用已由原來的網站、電子商務發展成商業應用系統的一種架構-B/S架構,它已成為一個世界性的研究熱點。但由于Internet網絡協議固有的局限性以及Web應用中頻繁的用戶交互增加了在Internet上實現長事務的困難,從而,Web應用中的并發控制始終沒能得到很好的解決。本文從Hibernate的樂觀鎖和悲觀鎖的實現原理出發,給出了實現悲觀鎖的基本思路和實現時的注意事項,在其它架構中得以推廣和應用。

引言

B/S構架的應用越來越普及,但由于它有別于C/S構架的特殊性,并發控制始終沒能得到很好的解決,如售票系統經常會出現同一張火車票出售多次的現象。典型的案例如下:

例如若有兩個客戶端,A客戶先讀取了賬戶余額2000元,之后B客戶也讀取了賬戶余額2000元的數據,A客戶提取了500元,對數據庫作了變更,此時數據庫中的余額為1500元,B客戶也要提取1300元,根據其所取得的資料,2000-1300將為700余額,若此時再對數據庫進行變更,最后的余額700元就會不正確,應當是200元,問題的出現是由于兩個客戶對同一條數據進行并發訪問造成的。

Web應用中并發控制的特殊性

上述問題在C/S構架中可以通過長事務來實現,但Web應用是基于Internet網絡環境的,其中的并發控制有其內在的特殊性:

1. Web所基于的網絡協議HTTP(Hyper Text Transfer Protocol)是一種無連接的協議,數據庫服務器無法保存事務的狀態信息;

2. 用戶可以隨時中止或啟動瀏覽器中當前主頁上的事務。

由于上述特殊性,Web應用中并發控制不能采用嚴格的長事務來實現,但可以長事務的思路來實現,在數據讀取的時候把相應的數據鎖定,在更新階段把鎖放開,然后更新數據。

Web應用中并發控制的實現

業務邏輯的實現過程中,往往需要保證數據訪問的排他性。如在 金融 系統的日終結算處理中,我們希望針對某個cut-off時間點的數據進行處理,而不希望在結算進行過程中(可能是幾秒種,也可能是幾個小時),數據再發生變化。此時,我們就需要通過一些機制來保證這些數據在某個操作過程中不會被外界修改,這樣的機制,就是所謂的“鎖”,即給選定的目標數據上鎖,使其無法被其他程序修改。有兩種鎖機制:即通常所說的“樂觀鎖(Optimistic Locking)” 和“悲觀鎖(Pessimistic Locking)”。

1.樂觀鎖(Optimistic Locking)

樂觀鎖(optimistic locking)則樂觀的認為資料的存取很少發生同時存取的問題,因而不作數據庫層次上的鎖定,為了維護正確的數據,樂觀鎖定使用應用程序上的邏輯實現版本控制來解決。

并發控制時,數據不一致的情況一旦發生,有幾個解決的 方法 ,一種是先更新為主,一種是后更新的為主,比較復雜的就是檢查發生變動的數據來實現,或是檢查所有屬性來實現樂觀鎖定。

Hibernate通過版本號檢查來實現后更新為主,這也是Hibernate所推薦的方式,在數據庫中加入一個VERSON欄記錄,在讀取數據時連同版本號一同讀取,并在更新數據時遞增版本號,然后比對版本號與數據庫中的版本號,如果大于數據庫中的版本號則予以更新,否則就回報錯誤。

以Hibernate實現版本號控制鎖定的話,我們的對象中增加一個version屬性,例如:

public class MyAccount {
  private int version;
  ....
  public void setVersion(int version) {
    this.version = version;
  }
  public int getVersion() {
    return version;
  }
  ....
}

而在映像文件中,我們使用optimistic-lock屬性設定version控制,屬性欄之后增加一個標簽,例如:

optimistic-lock="version"

設定好版本控制之后,在上例中如果B客戶試圖更新數據,將會引發StableObjectStateException例外,我們可以捕捉這個例外,在處理中重新讀取數據庫中的數據,同時將B客戶目前的數據與數據庫中的數據讀出來,讓B客戶有機會比對不一致的數據,以決定要變更的部份,或者您可以設計程式自動讀取新的資料,并重復扣款業務流程,直到數據可以更新為止,這一切可以在后臺執行,而不用讓您的客戶知道。在其它架構中也可通過這種思路來實現樂觀鎖,但版本控制和沖突的檢測要在自己程序的程序中實現和維護。

#p#

2.悲觀鎖(Pessimistic Locking)

雖然樂觀鎖能夠提高系統的性能,但它是對發生沖突的訪問進行事后的補救,應用在用戶輸入數據量很少的場合比較適合,但如果在 企業 ERP,用戶與系統交互涉及大量數據在頁面表單上錄入,如果事后提交失敗后才提示用戶要重新錄入是很不現實的,所以有必要進行事前控制,這就要采用悲觀鎖。

在多個客戶端可能讀取同一筆數據或同時更新一筆數據的情況下,防止同一個數據被修改而造成混亂,最簡單的手段就是在讀取時對數據進行鎖定,其它客戶端不能對同一筆數據進行更新的讀取動作。

悲觀鎖定(Pessimistic Locking)一如其名稱所示,悲觀的認定每次資料存取時,其它的客戶端也會存取同一筆數據,因此對該筆數據進行事先鎖定,直到自己操作完成后解除鎖定。

悲觀鎖定通常透過系統或數據庫本身的功能來實現,依賴系統或數據庫本身提供的鎖定機制,Hibernate即是如此,我們可以利用Query或Criteria的setLockMode()方法來設定要鎖定的表或列(row)及其鎖定模式,鎖定模式有以下的幾個:

LockMode.WRITE:在insert或update時進行鎖定,Hibernate會在save()方法時自動獲得鎖定。

LockMode.UPGRADE:利用SELECT … FOR UPDATE進行鎖定。

LockMode.UPGRADE_NOWAIT:利用SELECT … FOR UPDATE NOWAIT進行鎖定,在Oracle環境下使用。

LockMode.READ:在讀取記錄時Hibernate會自動獲得鎖定。

LockMode.NONE:沒有鎖定。

也可以在使用Session的load()或是lock()時指定鎖定模式以進行鎖定。

如果數據庫不支持所指定的鎖定模式,Hibernate會選擇一個合適的鎖定替換,而不是丟出一個例外。

3.其它構架中悲觀鎖的實現

Hibernate的悲觀鎖,也是基于數據庫的鎖機制實現。下面的代碼實現了對“用戶”查詢記錄的加鎖:

String sqlStr = "from userInfo as user where user.userId=’admin’";
Query query = session.createQuery(sqlStr);
query.setLockMode("user",LockMode.UPGRADE); //加鎖
List userList = query.list();//執行查詢,獲取數據

query.setLockMode對查詢語句中,特定別名所對應的記錄進行加鎖(我們為userInfo類指定了一個別名“user”),這里也就是對返回的所有user記錄進行加鎖:

select tuser0_.id as id, tuser0_.userId as userId, tuser0_.group_id as group_id, 
tuser0_.user_type as user_type, tuser0_.sex as sex from t_user tuser0_ where
(tuser0_.userId =’admin’ ) for update

通過上述轉換后的sql語句可知,Hibernate的加鎖其實是利用了數據庫的for update語句,在讀取階段對某條記錄的鎖定,而在更新階段提交,釋放鎖。

其實其它架構也可以采取該思路,不過,數據庫的for update語句的鎖定和釋放一定要在數據的同一個連接中,如果讀取階段和更新階段不是統一連接,即讀取之后斷開了與數據庫的連接,則for update語句的鎖定立即失效,為此,如果其它架構中要采取這種方式則要做相應的調整。

首先,由于Web應用是無狀態的,也就是說數據庫的for update語句的鎖定和釋放不一定是數據的同一個連接,為此,采用痕跡跟蹤法,在讀取數據時生成唯一的序列號(serialId),建立與數據連接的映射,并放置一個map數據結構中;在更新時,通過該serialId在連接池中重新獲取該連接,用該連接去更新數據。

如果系統是采用dao讀取數據,實體bean去更新數據,則只要在更新數據之前斷開讀取數據時的連接,則可以通過其它途徑更新數據,如下代碼所示:

public void update (AbstractEntityData data, String[] selTeamName ,String serialId) 
throws Exception {
   dao.closeConnect(serialId);
bo.update(data);
}

其中,dao.closeConnect(serialId)是斷開數據連接,bo.update(data)是通過EJB更新數據庫

4.序列號(serialId)的創建和維護

由于不同用戶可能同時建立連接或同一用戶先后建立連接,故創建序列號可以在讀取數據時通過sessionId和時間戳組合而成。而在操作的過程中,為了保持序列號不會丟失和唯一性,它不能放在session或application中,而是放在頁面的request對象里,通過它向其它頁面傳遞。

5.關聯表的鎖定

其實,Hibernate的悲觀鎖方式只能對單個表的記錄進行鎖定,但現實中,存在關聯更新的情況,即在更新主表的時候有可能會更新到與之相關的子表,與此同時,其它用戶也可能通過其它主表更新相應的子表同一條記錄。

有兩種方式處理,一是在讀取數據通過sql語句關聯子表相應記錄,因為for update對所有關聯表中符合條件的記錄都會加鎖;二是為子表找一個入口表,在更新子表的同時,必須更新子表的入口表。

6.例外操作的處理

采用這種方式,有一些例外情況必須小心處理,一是頁面的關閉,如果調用相應的方法,如onbeforeunload()等,釋放對應的數據庫連接;二是用戶非正常關機退出系統,必須有數據庫周期清除無用的連接,如間隔二十分鐘等,來釋放讀取時對數據的鎖定,否則,該數據會長時間被鎖定,直至應用服務器重啟。

結論

軟件系統的并發控制一般是通過加鎖來實現,同樣,Web應用也是采用樂觀鎖和悲觀鎖來實現,樂觀鎖是一種事后補救措施,是通過程序的邏輯控制版本來實現的,而悲觀鎖是事前的一種預防措施,它利用數據庫的鎖機制來實現,Hibernate對它做了一層封裝,使應用更加方便,為了讓其它架構都能適用,本文還原了Hibernate的實現原理,提出一般的實現思路和注意實現。

【編輯推薦】

  1. AJAX和XmlHttpRequest下的Web開發
  2. Java和PHP在Web開發方面的比較
  3. JSF進行Web開發的三大優勢
責任編輯:楊鵬飛 來源: 中國論文聯盟
相關推薦

2021-04-07 06:00:18

JavaScript 前端并發控制

2010-11-17 19:40:32

PacketShapeBlue Coat

2017-11-06 17:16:55

Linux設備驅動并發控制

2021-01-12 10:22:45

JavaScript并發控制前端

2010-06-08 12:54:16

UML技術

2011-12-30 16:30:39

Java

2011-05-18 16:02:08

XML

2009-02-03 10:19:45

2009-04-01 14:33:33

2010-06-13 13:13:12

UML建模

2009-07-29 17:44:02

ibmdwJava

2021-07-19 09:25:19

數據庫MySQL技術

2017-08-21 10:56:55

MySQL并發控制

2021-07-28 08:32:58

Go并發Select

2011-12-29 15:35:39

Web

2009-06-30 15:32:00

入侵檢測Java Web

2011-11-21 18:19:20

Web iMC

2021-08-28 10:06:29

VueJavascript應用

2010-11-08 10:57:05

SQL Server的

2022-11-29 19:44:47

WebOpenResty防火墻
點贊
收藏

51CTO技術棧公眾號

日韩免费一级| 91网址在线观看| 免费看黄色91| 欧美成人免费一级人片100| 欧美老女人bb| 久久久人成影片一区二区三区在哪下载 | 欧美久久久久久久久久久久久| 日本又骚又刺激的视频在线观看| 看片网站欧美日韩| 国产精品18久久久久久久久久久久| 亚洲精品第1页| 国产富婆一区二区三区| 国产乱码77777777| 欧美日韩精选| 在线精品高清中文字幕| 国产免费a级片| 欧美国产视频| 欧美日韩中文字幕在线| 穿情趣内衣被c到高潮视频| 三级视频在线| 成人动漫在线一区| 91精品久久久久久综合乱菊| 6080午夜伦理| 国内一区二区三区| 中文字幕日韩欧美在线视频| 免费成人深夜夜行p站| 精品视频91| 欧美最猛性xxxxx直播| 美女扒开大腿让男人桶| 1区2区在线观看| 国产精品天天看| 免费一区二区三区| 手机在线观看免费av| 国产一区欧美一区| 国产日韩中文在线| 国产婷婷色一区二区在线观看| 影音先锋在线一区| 欧美激情喷水视频| 超碰手机在线观看| 亚洲成av人片乱码色午夜| 中文字幕综合在线| 东方伊人免费在线观看| 国产亚洲电影| 一级做a爰片久久毛片美女图片| 日本50路肥熟bbw| 7777精品| 精品国产伦一区二区三区观看方式 | 周于希免费高清在线观看| 亚洲一区二区精品3399| 成人在线观看www| 麻豆影视在线观看_| 中文字幕不卡三区| 亚洲欧洲精品一区二区三区波多野1战4 | 高清成人在线| 在线观看视频欧美| 亚洲一区二区蜜桃| 99热播精品免费| 欧美日韩一级黄| 一本色道久久亚洲综合精品蜜桃| 天然素人一区二区视频| 在线观看三级视频欧美| mm131亚洲精品| 国产区一区二| 日韩美一区二区三区| 国产a级片视频| 国产精品18hdxxxⅹ在线| 亚洲精品美女在线| 亚洲区自拍偷拍| 成人一区而且| 久久久国产精品x99av| 中国毛片直接看| 韩日成人av| 欧美亚洲在线视频| 中文字幕在线观看欧美| 精品亚洲国产成人av制服丝袜| 91久久久久久久| 亚洲av无码片一区二区三区| 成人国产精品免费网站| 美国av一区二区三区| 国际av在线| 亚洲人精品一区| 777av视频| 偷拍精品精品一区二区三区| 欧美日韩大陆一区二区| 日本中文字幕精品| 羞羞色国产精品网站| 宅男66日本亚洲欧美视频| 男女做暖暖视频| 亚洲区第一页| 国产精品黄页免费高清在线观看| 97人人爽人人爽人人爽| 成人av综合一区| 欧洲一区二区在线观看| 黄色一级片在线观看| 亚洲国产精品一区二区久久恐怖片| 国产成人精品视频免费看| 九九热这里有精品| 亚洲成成品网站| 国产在线综合视频| 狠狠噜噜久久| 国产精品一二三视频| 丰满人妻一区二区三区免费视频 | 黄色片在线观看网站| 国产欧美69| 亚洲va久久久噜噜噜| 青草久久伊人| 一区二区三区中文免费| 欧美私人情侣网站| 色悠久久久久综合先锋影音下载| 亚洲视频欧洲视频| 久久精品国产亚洲av无码娇色 | 精品欧美不卡一区二区在线观看| 日韩毛片在线免费观看| 国产一级不卡毛片| 精品嫩草影院| 九九九久久国产免费| 最近中文字幕在线免费观看| 91免费看`日韩一区二区| 天天干天天操天天干天天操| 欧美日韩美女| 日韩国产激情在线| 久久久久久久久97| 狠狠色狠狠色综合系列| 日韩视频精品| 久久久男人天堂| 欧美本精品男人aⅴ天堂| 欧美自拍偷拍网| 日韩av中文在线观看| 国产无套精品一区二区| 日韩三级免费| 欧美一区二区三区视频在线 | 91精品国产麻豆国产在线观看 | 中文字幕一区二区人妻视频| 成人免费观看男女羞羞视频| 潘金莲一级淫片aaaaa免费看| 99热播精品免费| 国产午夜一区二区| 国产午夜精品久久久久| 91女神在线视频| 一女被多男玩喷潮视频| 国产精品xxx在线观看| 欧美老少配视频| 精品区在线观看| 亚洲免费在线视频一区 二区| 一级黄色特级片| 日韩精品免费一区二区在线观看| 国产精品成人v| 国产日韩精品在线看| 91福利区一区二区三区| 波多野结衣 在线| 亚洲女人av| 日本婷婷久久久久久久久一区二区| 秋霞伦理一区| 国产视频久久久久久久| 日本特级黄色片| 久久综合网色—综合色88| 亚洲精品乱码久久久久久自慰| 亚洲日产av中文字幕| 国产成人免费91av在线| 成人精品福利| 欧美美女一区二区| 538任你躁在线精品视频网站| 国产不卡视频在线观看| 成年人网站国产| 天海翼亚洲一区二区三区| 日韩av观看网址| 国产精品99999| 欧美日韩dvd在线观看| 麻豆网址在线观看| 国产成人日日夜夜| 99精品人妻少妇一区二区| 国产影视一区| 91久久久国产精品| 美女高潮视频在线看| 亚洲摸下面视频| 中文字幕在线观看第二页| 亚洲精品福利视频网站| 黄色录像a级片| 日本va欧美va瓶| 色哟哟免费网站| 香蕉视频一区| 成人国产精品免费视频| 国精产品一区一区三区mba下载| 日韩精品有码在线观看| 在线观看国产小视频| 一区二区三区四区高清精品免费观看| 添女人荫蒂视频| 久久国产精品99精品国产| 黄色a级片免费看| 欧美极品在线观看| 亚洲一区二区三区在线免费观看| 桃色av一区二区| 色一区av在线| 天天综合永久入口| 欧美精品免费视频| 免费在线不卡视频| 亚洲欧美激情小说另类| 中文字幕国产专区| 国产91丝袜在线播放九色| 成人黄色一区二区| 亚洲视频一区| 亚洲欧洲精品一区| 日日天天久久| 成人av中文| 久久久久黄色| 17婷婷久久www| 在线看福利影| 一区二区亚洲精品国产| 日韩一卡二卡在线| 欧美高清精品3d| 中文字幕亚洲乱码熟女1区2区| 亚洲女爱视频在线| 成人小视频免费看| 99精品欧美一区二区三区小说 | 男人天堂av在线播放| 亚洲精品日韩一| 91社区视频在线观看| 91在线精品秘密一区二区| 一级黄色免费毛片| 麻豆成人免费电影| av动漫免费看| 国产精品日韩欧美一区| 免费人成自慰网站| 91精品秘密在线观看| 亚洲精品在线免费看| 怕怕欧美视频免费大全| 国模精品娜娜一二三区| 一本色道69色精品综合久久| 成人妇女免费播放久久久| abab456成人免费网址| 日本老师69xxx| 亚洲涩涩在线| 欧洲美女7788成人免费视频| 白浆视频在线观看| 国内精品久久久久影院优| 四虎影院观看视频在线观看| 超碰97人人做人人爱少妇| 18免费在线视频| 中文字幕亚洲第一| 91看片在线观看| 中文字幕视频在线免费欧美日韩综合在线看 | 最新亚洲国产| 国产女精品视频网站免费| 成人av色网站| 国产精品一区二区三区久久| 韩日一区二区| 国产精品久久精品| 日韩欧美一区二区三区免费观看| 国产成人一区二区三区| 蜜桃精品在线| 国产一区二区在线免费| 91麻豆精品| 97神马电影| 国产伦精品一区二区三区在线播放 | 性刺激的欧美三级视频| 久久精品999| 午夜激情影院在线观看| 国产成人综合亚洲网站| 91传媒理伦片在线观看| 91在线码无精品| av电影网站在线观看| 国产精品美女久久久久久| 日韩欧美视频免费观看| 亚洲色图在线看| 久久久久久久久久久久久久久久久| 亚洲综合色噜噜狠狠| 精品久久免费视频| 91久久精品日日躁夜夜躁欧美| 亚洲最大成人av| 欧美一区二区三区日韩| 日本激情一区二区三区| 亚洲欧美中文字幕在线一区| jzzjzzjzz亚洲成熟少妇| 日韩中文综合网| 美女尤物在线视频| 欧美最猛性xxxxx免费| 成人四虎影院| www.久久久| 欧美日本成人| 亚洲中文字幕无码一区二区三区| 亚洲毛片网站| 亚洲国产精品三区| 高清国产一区二区| 91视频在线网站| 亚洲精品日韩综合观看成人91| 97超碰人人干| 欧美日韩精品欧美日韩精品一 | 色999韩欧美国产综合俺来也| 91丝袜脚交足在线播放| 国产99久久精品一区二区300| 正在播放亚洲| 国产精品乱看| 亚洲精品在线网址| 国产日韩欧美高清| 久久综合色综合| 欧美色老头old∨ideo| 黄色片网站免费在线观看| 深夜成人在线观看| 国产一二在线播放| 91欧美精品成人综合在线观看| 亚洲午夜久久| 青青青青在线视频| 精品亚洲成av人在线观看| 无码人妻精品一区二区三区温州 | 欧美在线在线| 日韩av一区二区三区美女毛片| 国产精品va| 午夜激情av在线| 26uuu精品一区二区在线观看| 欧美黑人性猛交xxx| 在线视频一区二区三区| 黄色美女一级片| 久久国产精品网站| 成人在线视频观看| 欧美大香线蕉线伊人久久| 国产精品99一区二区| av中文字幕网址| 国产日韩欧美亚洲| 国产精品国产三级国产专区52| 日韩一区二区三区三四区视频在线观看| 国产免费a∨片在线观看不卡| 久久久亚洲精选| 九色精品蝌蚪| 中文字幕一区二区三区精彩视频| 日韩激情视频在线观看| 久久精品老司机| 婷婷中文字幕综合| 亚洲国产日韩在线观看| 日韩中文字幕在线视频| 国产精品久久久久久吹潮| 欧美日韩成人一区二区三区| 中国女人久久久| 亚洲国产精品无码久久久久高潮| 亚洲一区二区三区在线看| 99产精品成人啪免费网站| 日韩中文在线中文网三级| 精品三区视频| 日韩精品一区二区三区外面| 久久av在线| 一区二区三区四区免费| 色噜噜久久综合| 男女网站在线观看| 日本一区二区在线播放| 国产成人三级| 久久久久久久片| 久久精品欧美一区二区三区麻豆| 亚洲天堂男人av| 亚洲欧洲在线观看| 亚洲第一会所| 亚洲欧美日产图| 久久精品国产99国产| 三级黄色片在线观看| 欧美丰满少妇xxxxx高潮对白| 黄色网在线播放| 99国内精品久久久久久久软件| 精久久久久久| 噜噜噜在线视频| 欧美在线看片a免费观看| avtt亚洲| 亚洲xxxx做受欧美| 欧美一区二区| 亚洲麻豆一区二区三区| 精品久久久久久亚洲国产300| 欧美一区二区少妇| 国产精品亚洲美女av网站| 羞羞答答成人影院www| 免费黄色在线播放| 岛国av在线不卡| 自拍视频在线| 99在线热播| 久久国产精品久久久久久电车 | 国产精品视频地址| 综合久久婷婷| av在线网站观看| 欧美久久一二区| 2018av在线| 手机看片福利永久国产日韩| 国产尤物一区二区在线| 青青草成人av| 最近2019中文免费高清视频观看www99| 亚洲免费看片| 日本人体一区二区| 国产日产欧产精品推荐色 | 国产精品 欧美精品| 国产成人在线观看网站| 日韩小视频在线观看| 国产精品99久久免费观看| 黄色一级二级三级| 一区二区三区在线高清| 国产在线免费观看| 亚洲xxxx在线| 日本91福利区| 日本亚洲欧美在线| 中日韩午夜理伦电影免费| 成人午夜网址| 国产九九在线视频| 亚洲午夜免费视频| 麻豆传媒在线免费看| 久久99久久99精品蜜柚传媒| 久久国产精品72免费观看|