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

J2EE事務并發控制策略總結

開發 后端
當前J2EE項目中,面臨的一個共同問題就是如果控制事務的并發訪問,而事務并發訪問主要可以分為兩類,分別是同一個系統事務和跨事務訪問的并發訪問控制。本文總結了幾個常用的控制策略。

本文結合Hibernate以及JPA標準,對J2EE當前持久層設計所遇到的幾個問題進行總結:

事務并發訪問控制策略

當前J2EE項目中,面臨的一個共同問題就是如果控制事務的并發訪問,雖然有些持久層框架已經為我們做了很多工作,但是理解原理,對于我們開發來說還是很有用處的。

事務并發訪問主要可以分為兩類,分別是同一個系統事務和跨事務訪問的并發訪問控制,其中同一個系統事務可以采取樂觀鎖以及悲觀鎖策略,而跨多個系統事務時則需要樂觀離線鎖和悲觀離線鎖。在討論這四種并發訪問控制策略之前,先需要明確一下數據庫事務隔離級別的問題,ANSI標準規定了四個數據庫事務隔離級別,它們分別是:

讀取未提交(Read Uncommitted)

這是***的事務隔離級別,讀事務不會阻塞讀事務和寫事務,寫事務也不會阻塞讀事務,但是會阻塞寫事務。這樣造成的一個結果就是當一個寫事務沒有提交的時候,讀事務照樣可以讀取,那么造成了臟讀的現象。

讀取已提交(Read Committed)

采用此種隔離界別的時候,寫事務就會阻塞讀事務和寫事務,但是讀事務不會阻塞讀事務和寫事務,這樣因為寫事務會阻塞讀取事務,那么從而讀取事務就不能讀到臟數據,但是因為讀事務不會阻塞其它的事務,這樣還是會造成不可重復讀的問題。

可重復讀(Repeatable Read)

采用此種隔離級別,讀事務會阻塞寫事務,但是讀事務不會阻塞讀事務,但是寫事務會阻塞寫事務和讀事務。因為讀事務阻塞了寫事務,這樣以來就不會造成不可重復讀的問題,但是這樣還是不能避免幻影讀問題。

序列化(serializable)

此種隔離級別是最嚴格的隔離級別,如果設置成這個級別,那么就不會出現以上所有的問題(臟讀,不可重復讀,幻影讀)。但是這樣以來會極大的影響到我們系統的性能,因此我們應該避免設置成為這種隔離級別,相反的,我們應該采用較低的隔離界別,然后再采用并發控制策略來進行事務的并發訪問控制)。

其實我們也可以把事務隔離級別設置為serializable,這樣就不需要采用并發控制策略了,數據庫就會為我們做好一切并發控制,但是這樣以來會嚴重影響我們系統的伸縮性和性能,所以在實踐中,我們一般采用讀取已提交或者更低的事務隔離級別,配合各種并發訪問控制策略來達到并發事務控制的目的。下面總結一下常用的控制策略:

1 樂觀鎖

樂觀鎖是在同一個數據庫事務中我們常采取的策略,因為它能使得我們的系統保持高的性能的情況下,提高很好的并發訪問控制。樂觀鎖,顧名思義就是保持一種樂觀的態度,我們認為系統中的事務并發更新不會很頻繁,即使沖突了也沒事,大不了重新再來一次。它的基本思想就是每次提交一個事務更新時,我們想看看要修改的東西從上次讀取以后有沒有被其它事務修改過,如果修改過,那么更新就會失敗,。

***我們需要明確一個問題,因為樂觀鎖其實并不會鎖定任何記錄,所以如果我們數據庫的事務隔離級別設置為讀取已提交或者更低的隔離界別,那么是不能避免不可重復讀問題的(因為此時讀事務不會阻塞其它事務),所以采用樂觀鎖的時候,系統應該要容許不可重復讀問題的出現。

了解了樂觀鎖的概念以后,那么當前我們系統中又是如何來使用這種策略的呢?一般可以采用以下三種方法:

版本(Version)字段:在我們的實體中增加一個版本控制字段,每次事務更新后就將版本字段的值加1.

時間戳(timestamps):采取這種策略后,當每次要提交更新的時候就會將系統當前時間和實體加載時的時間進行比較,如果不一致,那么就報告樂觀鎖失敗,從而回滾事務或者重新嘗試提交。采用時間戳有一些不足,比如在集群環境下,每個節點的時間同步也許會成問題,并且如果并發事務間隔時間小于當前平臺最小的時鐘單位,那么就會發生覆蓋前一個事務結果的問題。因此一般采用版本字段比較好。

基于所有屬性進行檢測:采用這種策略的時候,需要比較每個字段在讀取以后有沒有被修改過,所以這種策略實現起來比較麻煩,要求對每個屬性都進行比較,如果采用hiernate的話,因為Hibernate在一級緩存中可以進行臟檢測,那么可以判斷哪些字段被修改過,從而動態的生成sql語句進行更新。

下面再總結一下如何在JDBC和Hibernate中使用樂觀鎖:

#p#

JDBC中使用樂觀鎖:如果我們采用JDBC來實現持久層的話,那么就可以采用以上將的三種支持樂觀鎖的策略,在實體中增加一個version字段或者一個Date字段,也可以采用基于所有屬性的策略,下面就采用version字段來做一演示:

假如系統中有一個Account的實體類,我們在Account中多加一個version字段,那么我們JDBC Sql語句將如下寫:

Select a.version....from Account as a where (where condition..)
Update Account set version = version+1.....(another field) where version =?...(another contidition)


這樣以來我們就可以通過更新結果的行數來進行判斷,如果更新結果的行數為0,那么說明實體從加載以來已經被其它事務更改了,所以就拋出自定義的樂觀鎖定異常(或者也可以采用Spring封裝的異常體系)。具體實例如下:

.......
int rowsUpdated = statement.executeUpdate(sql);
If(rowsUpdated= =0){
throws new OptimisticLockingFailureException();
}
........


在使用JDBC API的情況下,我們需要在每個update語句中,都要進行版本字段的更新以及判斷,因此如果稍不小心就會出現版本字段沒有更新的問題,相反當前的 ORM框架卻為我們做好了一切,我們僅僅需要做的就是在每個實體中都增加version或者是Date字段。

Hibernate中使用樂觀鎖:如果我們采用Hibernate做為持久層的框架,那么實現樂觀鎖將變得非常容易,因為框架會幫我們生成相應的sql語句,不僅減少了開發人員的負擔,而且不容易出錯。下面同樣采用version字段的方式來總結一下:
同樣假如系統中有一個Account的實體類,我們在Account中多加一個version字段,

public class Account{
Long id ;
.......
@Version //也可以采用XML文件進行配置
Int version
.......

}


這樣以來每次我們提交事務時,hibernate內部會生成相應的SQL語句將版本字段加1,并且進行相應的版本檢測,如果檢測到并發樂觀鎖定異常,那么就拋出StaleObjectStateException.

2 悲觀鎖

所謂悲觀鎖,顧名思義就是采用一種悲觀的態度來對待事務并發問題,我們認為系統中的并發更新會非常頻繁,并且事務失敗了以后重來的開銷很大,這樣以來,我們就需要采用真正意義上的鎖來進行實現。悲觀鎖的基本思想就是每次一個事務讀取某一條記錄后,就會把這條記錄鎖住,這樣其它的事務要想更新,必須等以前的事務提交或者回滾解除鎖。

***我們還是需要明確一個問題,假如我們數據庫事務的隔離級別設置為讀取已提交或者更低,那么通過悲觀鎖,我們控制了不可重復讀的問題,但是不能避免幻影讀的問題(因為要想避免我們就需要設置數據庫隔離級別為Serializable,而一般情況下我們都會采取讀取已提交或者更低隔離級別,并配合樂觀或者悲觀鎖來實現并發控制,所以幻影讀問題是不能避免的,如果想避免幻影讀問題,那么你只能依靠數據庫的serializable隔離級別(幸運的是幻影讀問題一般情況下不嚴重)。

下面就分別以JDBC和Hibernate來總結一下:

JDBC中使用悲觀鎖:在JDBC中使用悲觀鎖,需要使用select for update語句,假如我們系統中有一個Account的類,我們可以采用如下的方式來進行:

Select * from Account where ...(where condition).. for update.


當使用了for update語句后,每次在讀取或者加載一條記錄的時候,都會鎖住被加載的記錄,那么當其他事務如果要更新或者是加載此條記錄就會因為不能獲得鎖而阻塞,這樣就避免了不可重復讀以及臟讀的問題,但是其他事務還是可以插入和刪除記錄,這樣也許同一個事務中的兩次讀取會得到不同的結果集,但是這不是悲觀鎖鎖造成的問題,這是我們數據庫隔離級別所造成的問題。

***還需要注意的一點就是每個沖突的事務中,我們必須使用select for update 語句來進行數據庫的訪問,如果一些事務沒有使用select for update語句,那么就會很容易造成錯誤,這也是采用JDBC進行悲觀控制的缺點。

Hibernate中使用悲觀鎖:相比于JDBC使用悲觀鎖來說,在Hibernate中使用悲觀鎖將會容易很多,因為Hibernate有API讓我們來調用,從而避免直接寫SQL語句。下面就Hibernate使用悲觀鎖做一總結:

首先先要明確一下Hibernate中支持悲觀鎖的兩種模式LockMode.UPGRADE以LockMode.UPGRADE_NO_WAIT.(PS:在JPA中,對應的鎖模式是LockModeType.Read,這與Hibernate是不一樣的呵呵)
假如我們系統中有一個Account的類,那么具體的操作可以像這樣:

.......
session.lock(account, LockMode.UPGRADE);
......

或者也可以采用如下方式來加載對象:
session.get(Account.class,identity,LockMode.UPGRADE).


這樣以來當加載對象時,hibernate內部會生成相應的select for update語句來加載對象,從而鎖定對應的記錄,避免其它事務并發更新。

以上兩種策略都是針對同一個事務而言的,如果我們要實現跨多個事務的并發控制就要采用其它兩種并發控制策略了,下面做一總結:

C++與java是兩種完全不同風格的東西,C++是由程序員創造的,由程序員完善的,然后才出的標準的,也就是說C++的標準完全落后與C++的發展。java恰好相反,它是先有標準(可能還沒有實現),然后后有的實現,而且它是由公司主導開發的,雖然現在開源了,但是標準并不是誰都能定的。這就造就了C++是百花齊放,博大精深,很少有人敢說自己C++很厲害。java卻是另外的一種感覺,一切都規定好了,你只需要按照規定去做,符合標準才可以的。所以C++是那種既可以做的堂堂正正,博大精深(比如標準庫),又可以實現的匪夷所思,天馬行空(寫 Boost庫的人太牛了)。java不行,java要求如此只能如此,不能越雷池一步。

【編輯推薦】

  1. Web應用中并發控制的實現
  2. Hibernate的事務和并發
  3. 詳解Java多線程開發中的數據同步
責任編輯:yangsai 來源: J道
相關推薦

2011-06-07 09:37:32

J2EE

2009-06-23 08:06:46

J2EE體系架構J2EE模型J2EE設計模式

2009-06-10 14:10:23

J2EE學習J2EE是什么

2009-06-11 17:06:11

J2EE歷史Java EE概述

2009-06-10 13:37:06

J2EE可伸縮性J2EE靈活性J2EE維護

2009-06-23 16:48:26

J2EE常見問題J2EE平臺

2009-06-22 17:05:41

Java EEJava企業應用

2009-06-23 08:12:48

J2EE調用存儲過程

2009-06-22 17:34:40

J2EE架構

2009-06-18 15:54:57

J2EE下使用JNDI

2009-06-18 16:13:14

J2EE開發

2009-06-22 16:21:02

J2EE線程

2011-03-08 10:15:39

J2EE

2011-12-31 15:24:48

JavaJ2EE

2011-07-21 16:09:36

J2EE

2011-05-16 14:07:58

J2EE

2009-06-11 17:11:07

J2EE設計模式工廠模式

2009-06-22 11:04:00

Jdbc存儲過程

2009-02-23 11:18:06

J2EE架構師Java

2009-06-19 17:03:44

J2EE學習
點贊
收藏

51CTO技術棧公眾號

奇米一区二区| 91一区二区三区在线| 青青草国产成人av片免费| 日韩在线视频国产| 年下总裁被打光屁股sp| 亚洲精品88| 中文字幕制服丝袜一区二区三区| 91香蕉视频在线下载| 国产成人一级片| 91精品婷婷色在线观看| 亚洲精品99999| 91高清国产视频| 爱草tv视频在线观看992| 国产欧美日韩精品一区| 99精品在线直播| 综合久久中文字幕| 亚洲三级色网| 久久久国产精品亚洲一区| 日韩国产美国| 91九色蝌蚪91por成人| 国产情侣一区| 免费97视频在线精品国自产拍| 亚洲精品视频大全| 欧美日韩黄色| 欧美日韩日本视频| 日韩中文字幕免费在线| av资源在线看片| 亚洲欧美日韩国产综合| 视频一区二区三区在线观看| 五月婷婷丁香花| 国产麻豆精品在线| 国产精品吴梦梦| 日日摸天天添天天添破| 在线免费观看欧美| 欧美激情按摩在线| avtt天堂在线| 91精品综合| 色噜噜久久综合伊人一本| 中文幕无线码中文字蜜桃| 97视频一区| 欧美一卡二卡三卡| 在线播放av中文字幕| 成人交换视频| 欧美中文字幕一区二区三区亚洲| 日韩在线视频在线观看| 岛国av免费在线观看| 亚洲一区二区在线观看视频 | 国产精品毛片视频| 日韩一区二区三区四区五区六区| 中文字幕网av| jizz亚洲女人高潮大叫| 欧美性大战久久久久久久 | wwww在线观看免费视频| 夜夜操天天操亚洲| bt天堂新版中文在线地址| 中文字幕在线三区| 亚洲一卡二卡三卡四卡无卡久久| 成年人三级视频| 成码无人av片在线观看网站| 亚洲人吸女人奶水| 最新av网址在线观看| 国产黄大片在线观看画质优化| 国产精品人妖ts系列视频| 亚洲欧美日韩另类精品一区二区三区| 二区在线观看| 国产精品网站在线观看| 中文字幕日韩一区二区三区不卡| 欧美jizz18性欧美| 亚洲精品视频一区| 国产无限制自拍| xxxxx性欧美特大| 欧美在线免费观看视频| 欧美三级午夜理伦三级富婆| 亚洲伦理一区二区| 日韩午夜电影av| 最近中文字幕无免费| 国产99精品| 久久亚洲精品网站| 久久精品免费在线| 爽好多水快深点欧美视频| 国产精品一区二区久久国产| 99视频免费看| 暴力调教一区二区三区| 日本在线观看一区二区| 麻豆影院在线观看| 午夜精品久久久久久久久久| 成年人网站大全| 国产人与zoxxxx另类91| 日韩成人xxxx| 亚洲v国产v欧美v久久久久久| 国产在线精品一区二区中文| 国产视频精品久久| 亚洲精品中文在线观看| 久久久999视频| 亚洲国产91视频| 亚洲精品999| 登山的目的在线| 国产欧美日韩综合一区在线播放 | 亚洲欧洲一二区| 精品美女在线播放| 一级片视频免费看| 国产字幕视频一区二区| 国产福利精品在线| 亚洲黄色片视频| 国产片一区二区三区| 欧美国产综合在线| 欧美一区二区三区婷婷| 日韩大片免费观看视频播放| 99热6这里只有精品| 国产视频一区三区| 91亚洲va在线va天堂va国| 瑟瑟在线观看| 亚洲一区二区综合| 中日韩av在线播放| 国产毛片一区二区三区| 欧美精品激情在线观看| 国产美女三级无套内谢| 国产亚洲欧美日韩在线一区| 日韩精品在线视频免费观看| 免费视频观看成人| 亚洲欧洲美洲在线综合| 日本少妇性高潮| 国产高清无密码一区二区三区| 日本一区二区精品视频| 2018av在线| 欧美不卡在线视频| 劲爆欧美第一页| 精品一区二区在线播放| 涩涩日韩在线| 欧洲一级精品| 亚洲理论在线a中文字幕| 精品视频一区二区在线观看| 国产乱人伦偷精品视频免下载| 亚洲精品一区二区三区四区五区 | 日本一区二区在线观看视频| 天天综合国产| 91精品国产综合久久香蕉的用户体验 | 国产精品探花视频| 国产日本欧美一区二区| 中文字幕日本最新乱码视频| 免费萌白酱国产一区二区三区| 欧美日韩xxx| 99精品久久久久久中文字幕| 中文字幕在线不卡| 中文字幕第100页| 成人高清电影网站| 国产精品专区h在线观看| 国产二区在线播放| 欧美三级欧美一级| 极品蜜桃臀肥臀-x88av| 青娱乐精品视频在线| 欧洲亚洲一区二区| 欧美色片在线观看| 三级精品视频久久久久| 亚洲综合一区中| 亚洲人成在线观看一区二区| www.51色.com| 重囗味另类老妇506070| 99在线视频免费观看| 黄页网站在线观看免费| 亚洲国产第一页| 国产成人愉拍精品久久 | 欧美日韩高清一区二区不卡| 国精产品一区一区| 精品一区二区三区视频在线观看 | 午夜羞羞小视频在线观看| 日韩一区二区三区av| 久青草视频在线观看| 99视频超级精品| 37pao成人国产永久免费视频| 国际精品欧美精品| 国产欧美一区二区三区四区| 国产激情在线视频| 亚洲大胆美女视频| www.欧美色| 最新国产成人在线观看| 国产免费无码一区二区| 亚洲综合精品四区| 亚洲欧美国产精品桃花| 亚洲天堂一区在线| 亚州综合一区| 日韩av电影在线播放| 97视频在线观看网站| 欧美一区二区在线播放| 日韩av在线播放观看| 国产视频一区不卡| a级大片免费看| 国产欧美精品| 中文字幕日韩一区二区三区不卡 | 欧美18视频| 欧美成人福利| 亚州精品天堂中文字幕| 91在线视频| 亚洲国产欧美一区二区三区久久| 久久久久精彩视频| 亚洲国产成人av| 中文字幕精品亚洲| 99热这里都是精品| 日韩在线一区视频| 蜜乳av另类精品一区二区| 国产91av视频在线观看| 久久久久高潮毛片免费全部播放| 国产精品欧美激情在线播放| 超碰97国产精品人人cao| 中文字幕精品在线| 丝袜视频国产在线播放| 91精品国产91久久久久久一区二区| 久久久久久久久久久久久av| 亚洲人精品午夜| av黄色在线免费观看| 丁香激情综合五月| 天天操狠狠操夜夜操| 亚洲综合99| 无码熟妇人妻av在线电影| 98精品久久久久久久| 美女视频久久| 成午夜精品一区二区三区软件| 国产精品爽黄69天堂a| 在线看片国产福利你懂的| 久国内精品在线| 嫩草在线视频| 中文国产成人精品| 三级毛片在线免费看| 亚洲成年人在线| 国产成人久久精品77777综合 | 91av在线网站| 啦啦啦中文在线观看日本| 久久精品电影网站| 日韩精品毛片| 国产精品99久久久久| 国产精品日韩二区| 亚洲国产欧美在线观看| 成人精品aaaa网站| 日韩成人免费av| 国产日韩欧美在线视频观看| 澳门av一区二区三区| 日本成人黄色片| 亚洲精品永久免费视频| 2020欧美日韩在线视频| 99riav视频在线观看| 国内免费精品永久在线视频| 日本无删减在线| 欧美人在线视频| 福利小视频在线| 羞羞色国产精品| 悠悠资源网亚洲青| 日本中文字幕久久看| 日韩成人av电影| 日韩免费在线播放| 性欧美freehd18| 国产在线高清精品| 国产午夜精品一区在线观看| 亚洲精品欧美一区二区三区| 午夜视频一区二区在线观看| 国产精品久久久久久久小唯西川| ccyy激情综合| 久热这里只精品99re8久| 伊人久久大香线蕉| 亚洲欧美影院| 午夜精品亚洲| 国产精品久久..4399| 国产欧美午夜| 99视频在线免费| 另类小说一区二区三区| 在线观看视频在线观看| 丁香啪啪综合成人亚洲小说 | 99国产精品久久久久99打野战| 欧美肥妇毛茸茸| 亚洲第一成人av| 亚洲精品中文字幕女同| 在线a人片免费观看视频| 欧美成人午夜免费视在线看片| 超碰在线最新网址| 国产suv精品一区二区三区88区| 日日狠狠久久| 国产福利久久| 欧美艳星介绍134位艳星| 午夜在线视频免费观看| 亚洲高清免费| 爱情岛论坛成人| 国产精品中文字幕一区二区三区| 免费日本黄色网址| 中文字幕国产一区| 国产亚洲欧美精品久久久www| 欧美性猛交xxx| 国产精品久久久久久久久久久久久久久久久久 | 亚洲成在人线免费| 无码人妻熟妇av又粗又大| 欧美精品在线一区二区| 日本精品999| 色伦专区97中文字幕| 55av亚洲| 亚洲sss综合天堂久久| 狼人精品一区二区三区在线 | 在线电影一区二区三区| 老熟妇高潮一区二区高清视频 | av毛片在线免费看| 欧美专区第一页| 亚洲国产视频二区| 亚洲精品二区| 99re国产精品| 亚洲视频在线不卡| 日本一区二区视频在线观看| 国产精品1234区| 欧美高清精品3d| 青青色在线视频| 久久久久久久久久久网站| 亚洲免费一区| 奇米视频888战线精品播放| 韩国欧美一区| 色婷婷一区二区三区在线观看| 久久综合一区二区| 久久久久成人网站| 91麻豆精品国产91久久久更新时间| 精品视频一二区| 午夜免费日韩视频| 77成人影视| 99re99热| 久久精品国产精品亚洲红杏| 37p粉嫩大胆色噜噜噜| 亚洲国产精品影院| 国产黄a三级三级三级| 三级精品视频久久久久| 日韩在线免费| 日本黑人久久| 亚洲一区欧美激情| 黄色免费视频网站| 亚洲成年人影院| 亚洲精品一区二区三区蜜桃| 久久久99免费视频| 2020国产精品小视频| 亚洲免费精品视频| 毛片av一区二区| 夜夜春很很躁夜夜躁| 色琪琪一区二区三区亚洲区| 永久av免费在线观看| 国产欧美一区二区精品久久久| 今天免费高清在线观看国语| 精品一区二区在线免费观看| 少妇高潮惨叫久久久久| 欧美性猛片xxxx免费看久爱| 国产日本在线| 国产精品久久久久久久久久久久 | 亚洲欧美精品| 麻豆精品一区二区三区| 天堂av网手机版| 欧美日韩一区二区三区高清| av资源网站在线观看| 国产精品免费在线免费| 日韩精品电影| 一区二区久久精品| 亚洲人成在线观看一区二区| www.黄色小说.com| 欧美国产视频一区二区| 国产成人夜色高潮福利影视| 国产一区二区三区小说| 99久久99久久久精品齐齐| 国产成人无码av| 深夜福利一区二区| 精品国产一区二区三区2021| av动漫在线免费观看| 不卡影院免费观看| 男人天堂2024| 中文字幕亚洲无线码a| 国产欧美日韩电影| 人妻夜夜添夜夜无码av | 鲁丝一区二区三区免费| 久久一区欧美| 91免费公开视频| 亚洲国产精品久久久久秋霞蜜臀| 色在线免费观看| 在线国产精品网| 岛国av在线一区| 国产精品suv一区| 久久精品视频在线播放| 亚洲一区二区三区免费| 久久久久人妻精品一区三寸| 国产拍欧美日韩视频二区| 91成年人视频| 国内外成人免费激情在线视频网站| 竹菊久久久久久久| 日本高清久久久| 亚洲成a人在线观看| 国产免费av高清在线| 99爱精品视频| 久久婷婷av| 亚洲熟女www一区二区三区| 日韩精品视频在线观看免费| 国产美女久久| 欧美日韩一道本| ●精品国产综合乱码久久久久| 亚洲欧美强伦一区二区| 国产精品黄色av| 黄色成人91| 久久久99999| 日韩精品在线观看网站| 国产精品一区二区精品视频观看| 黄色一级在线视频| 亚洲三级免费观看| 国产毛片在线看|