中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      J2EE控制策略

      時(shí)間:2024-10-21 10:24:47 J2EE培訓(xùn) 我要投稿
      • 相關(guān)推薦

      J2EE控制策略

        J2EE事務(wù)并發(fā)訪問主要可以分為兩類,分別是同一個(gè)系統(tǒng)事務(wù)和跨事務(wù)訪問的并發(fā)訪問控制,其中同一個(gè)系統(tǒng)事務(wù)可以采取樂觀鎖以及悲觀鎖策略,而跨多個(gè)系統(tǒng)事務(wù)時(shí)則需要樂觀離線鎖和悲觀離線鎖。

        樂觀鎖

        樂觀鎖是在同一個(gè)數(shù)據(jù)庫(kù)事務(wù)中我們常采取的策略,因?yàn)樗苁沟梦覀兊南到y(tǒng)保持高的性能的情況下,提供很好的并發(fā)訪問控制。樂觀鎖,顧名思義就是保持一種樂觀的態(tài)度,我們認(rèn)為系統(tǒng)中的事務(wù)并發(fā)更新不會(huì)很頻繁,即使沖突了也沒事,大不了重新再來一次。它的基本思想就是每次提交一個(gè)事務(wù)更新時(shí),我們想看看要修改的東西從上次讀取以后有沒有被其它事務(wù)修改過,如果修改過,那么更新就會(huì)失敗。

        因?yàn)闃酚^鎖其實(shí)并不會(huì)鎖定任何記錄,所以數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別設(shè)置為讀取已提交或者更低的隔離界別,那么是不能避免不可重復(fù)讀問題的(因?yàn)榇藭r(shí)讀事務(wù)不會(huì)阻塞其它事務(wù)),所以采用樂觀鎖的時(shí)候,系統(tǒng)應(yīng)該要容許不可重復(fù)讀問題的出現(xiàn)。

        一般可以采用以下三種方法:

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

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

        基于所有屬性進(jìn)行檢測(cè):采用這種策略的時(shí)候,需要比較每個(gè)字段在讀取以后有沒有被修改過,所以這種策略實(shí)現(xiàn)起來比較麻煩,要求對(duì)每個(gè)屬性都進(jìn)行比較,如果采用hibernate的話,因?yàn)镠ibernate在一級(jí)緩存中可以進(jìn)行臟檢測(cè),那么可以判斷哪些字段被修改過,從而動(dòng)態(tài)的生成sql語(yǔ)句進(jìn)行更新。

        在JDBC和Hibernate中使用樂觀鎖:

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

        假如系統(tǒng)中有一個(gè)Account的實(shí)體類,我們?cè)贏ccount中多加一個(gè)version字段,那么我們JDBC Sql語(yǔ)句將如下寫:

        Select a.version....from Account as a where (where condition..)

        Update Account set version = version+1.....(another field) where version =?...(another contidition)

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

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

        Hibernate中使用樂觀鎖:如果采用Hibernate做為持久層的框架,那么實(shí)現(xiàn)樂觀鎖將變得非常容易,因?yàn)榭蚣軙?huì)幫我們生成相應(yīng)的sql語(yǔ)句,不僅減少了開發(fā)人員的負(fù)擔(dān),而且不容易出錯(cuò)。下面同樣采用version字段的方式來總結(jié)一下:

        同樣假如系統(tǒng)中有一個(gè)Account的實(shí)體類,我們?cè)贏ccount中多加一個(gè)version字段,

        提交事務(wù)時(shí),hibernate內(nèi)部會(huì)生成相應(yīng)的SQL語(yǔ)句將版本字段加1,并且進(jìn)行相應(yīng)的版本檢測(cè),如果檢測(cè)到并發(fā)樂觀鎖定異常,那么就拋出StaleObjectStateException.

        悲觀鎖

        所謂悲觀鎖,顧名思義就是采用一種悲觀的態(tài)度來對(duì)待事務(wù)并發(fā)問題,系統(tǒng)中的并發(fā)更新會(huì)非常頻繁,并且事務(wù)失敗了以后重來的開銷很大,這樣就需要采用真正意義上的鎖來進(jìn)行實(shí)現(xiàn)。悲觀鎖的基本思想就是每次一個(gè)事務(wù)讀取某一條記錄后,就會(huì)把這條記錄鎖住,這樣其它的事務(wù)要想更新,必須等以前的事務(wù)提交或者回滾解除鎖。

        最后還是需要明確一個(gè)問題,假如數(shù)據(jù)庫(kù)事務(wù)的隔離級(jí)別設(shè)置為讀取已提交或者更低,那么通過悲觀鎖,控制了不可重復(fù)讀的問題,但是不能避免幻影讀的問題(因?yàn)橐氡苊馕覀兙托枰O(shè)置數(shù)據(jù)庫(kù)隔離級(jí)別為Serializable,而一般情況下會(huì)采取讀取已提交或者更低隔離級(jí)別,并配合樂觀或者悲觀鎖來實(shí)現(xiàn)并發(fā)控制,所以幻影讀問題是不能避免的,如果想避免幻影讀問題,那么只能依靠數(shù)據(jù)庫(kù)的serializable隔離級(jí)別(幸運(yùn)的是幻影讀問題一般情況下不嚴(yán)重)。

        下面就分別以JDBC和Hibernate來總結(jié)一下:

        JDBC中使用悲觀鎖:在JDBC中使用悲觀鎖,需要使用select for update語(yǔ)句,假如我們系統(tǒng)中有一個(gè)Account的類,我們可以采用如下的方式來進(jìn)行:

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

        當(dāng)使用了for update語(yǔ)句后,每次在讀取或者加載一條記錄的時(shí)候,都會(huì)鎖住被加載的記錄,那么當(dāng)其他事務(wù)如果要更新或者是加載此條記錄就會(huì)因?yàn)椴荒塬@得鎖而阻塞,這樣就避免了不可重復(fù)讀以及臟讀的問題,但是其他事務(wù)還是可以插入和刪除記錄,這樣也許同一個(gè)事務(wù)中的兩次讀取會(huì)得到不同的結(jié)果集,但是這不是悲觀鎖所造成的問題,這是數(shù)據(jù)庫(kù)隔離級(jí)別所造成的問題。

        最后還需要注意的一點(diǎn)就是每個(gè)沖突的事務(wù)中,必須使用select for update 語(yǔ)句來進(jìn)行數(shù)據(jù)庫(kù)的訪問,如果一些事務(wù)沒有使用select for update語(yǔ)句,那么就會(huì)很容易造成錯(cuò)誤,這也是采用JDBC進(jìn)行悲觀控制的缺點(diǎn)。

        Hibernate中使用悲觀鎖:相比于JDBC使用悲觀鎖來說,在Hibernate中使用悲觀鎖將會(huì)容易很多,因?yàn)镠ibernate有API讓我們來調(diào)用,從而避免直接寫SQL語(yǔ)句。下面就Hibernate使用悲觀鎖做一總結(jié):

        首先先要明確一下Hibernate中支持悲觀鎖的兩種模式LockMode.UPGRADE以LockMode.UPGRADE_NO_WAIT.(PS:在JPA中,對(duì)應(yīng)的鎖模式是LockModeType.Read,這與Hibernate是不一樣的呵呵)

        假如系統(tǒng)中有一個(gè)Account的類,那么具體的操作可以像這樣:

        或者也可以采用如下方式來加載對(duì)象:

        這樣以來當(dāng)加載對(duì)象時(shí),hibernate內(nèi)部會(huì)生成相應(yīng)的select for update語(yǔ)句來加載對(duì)象,從而鎖定對(duì)應(yīng)的記錄,避免其它事務(wù)并發(fā)更新。

      【J2EE控制策略】相關(guān)文章:

      J2EE應(yīng)用下基于AOP的抓取策略03-09

      酒店采購(gòu)成本控制的策略03-08

      關(guān)于企業(yè)物流成本控制的策略01-29

      物流供應(yīng)鏈成本控制的策略03-06

      物流供應(yīng)鏈成本控制策略是什么03-09

      什么是J2EE03-16

      j2ee介紹03-20

      J2EE的概念03-19

      J2EE發(fā)展?fàn)顩r03-19

      主站蜘蛛池模板: 亚洲av一二三又爽又爽又色| 操B小视频国产| 亚洲午夜久久久精品国产| 欧美zozo另类人禽交| 中日韩欧美成人免费播放| 日韩午夜在线视频观看| 新河县| 人妻少妇精品系列一区二区| 区无码字幕中文色| 久久er这里都是精品23| 亚洲一区二区三区四区三级视频| 日本五十路熟女在线视频| av在线免费观看你懂的| 国产精品女主播在线观看| 视频一区视频二区亚洲免费观看| 林州市| 亚洲大尺度视频在线看| 精品国产乱码一区二区三区在线| 激情内射亚洲一区二区| 色综合久久久久综合一本到桃花网| 新源县| 91青青草久久| 日本区一区二在线免费观看| 德令哈市| 久久人妻av不卡中文字幕| 成年女人在线观看毛片| 久久久高清免费视频| 精品少妇后入一区二区三区 | 久草久热这里只有精品| 亚洲中文字幕无码不卡电影| 精品久久久亚洲中文字幕| av狼人婷婷久久亚洲综合| 久久久久久岛国免费网站| 精品黄色av一区二区三区| 男女视频在线观看一区二区三区| 久久精品国产亚洲av热九| 日本熟妇人妻右手影院| 最新版av天堂熟女免费播放| 亚洲福利一区二区在线| 国产精品成人免费久久黄| 久久青草亚洲AV无码麻豆|