agapple

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            13 Posts :: 1 Stories :: 1 Comments :: 0 Trackbacks
           

          事務(wù)的四個(gè)屬性:原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)。

          1.原子性(Atomic)
              最重要的原則,也是最容易理解的原則。被事務(wù)管理的所有方法,要么一起被提交,要么一起回滾。

          2.一致性(Consistency)
              事務(wù)在系統(tǒng)完整性中實(shí)施一致性,如果事務(wù)成功地完成,那么系統(tǒng)中所有變化將正確地應(yīng)用,系統(tǒng)處于新有效狀態(tài)。如果在事務(wù)中出現(xiàn)錯(cuò)誤,那么系統(tǒng)中的所有變化將自動(dòng)地回滾,系統(tǒng)返回到原始狀態(tài)。

          3.隔離性(Isolation)
              在隔離狀態(tài)執(zhí)行事務(wù),使它們好像是系統(tǒng)在給定時(shí)間內(nèi)執(zhí)行的唯一操作。如果有兩個(gè)事務(wù),運(yùn)行在相同的時(shí)間內(nèi),執(zhí)行相同的功能,事務(wù)的隔離性將確保每一事務(wù)在系統(tǒng)中認(rèn)為只有該事務(wù)在使用系統(tǒng)。這種屬性有時(shí)稱為串行化,為了防止事務(wù)操作間的混淆,必須串行化或序列化請(qǐng)求,使得在同一時(shí)間僅有一個(gè)請(qǐng)求用于同一數(shù)據(jù)。重要的是,在隔離狀態(tài)執(zhí)行事務(wù),系統(tǒng)的狀態(tài)有可能是不一致的,在結(jié)束事務(wù)前,應(yīng)確保系統(tǒng)處于一致狀態(tài)。但是在每個(gè)單獨(dú)的事務(wù)中,系統(tǒng)的狀態(tài)可能會(huì)發(fā)生變化。如果事務(wù)不是在隔離狀態(tài)運(yùn)行,它就可能從系統(tǒng)中訪問(wèn)數(shù)據(jù),而系統(tǒng)可能處于不一致狀態(tài)。通過(guò)提供事務(wù)隔離,可以阻止這類事件的發(fā)生。

          4.持久性(Durability)
              持久性意味著一旦事務(wù)執(zhí)行成功,在系統(tǒng)中產(chǎn)生的所有變化將是永久的。應(yīng)該存在一些檢查點(diǎn)防止在系統(tǒng)失敗時(shí)丟失信息。甚至硬件本身失敗,系統(tǒng)的狀態(tài)仍能通過(guò)在日志中記錄事務(wù)完成的任務(wù)進(jìn)行重建。

          數(shù)據(jù)庫(kù)鎖概念:
              
          在數(shù)據(jù)庫(kù)中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當(dāng)數(shù)據(jù)對(duì)象被加上排它鎖時(shí),其他的事務(wù)不能對(duì)它讀取和修改。加了共享鎖的數(shù)據(jù)對(duì)象可以被其他事務(wù)讀取,但不能修改。數(shù)據(jù)庫(kù)利用這兩種基本的鎖類型來(lái)對(duì)數(shù)據(jù)庫(kù)的事務(wù)進(jìn)行并發(fā)控制。
              從程序員的角度看,鎖分為以下兩種類型: 
              1.樂(lè)觀鎖(Optimistic Lock) 
              樂(lè)觀鎖假定在處理數(shù)據(jù)時(shí),不需要在應(yīng)用程序的代碼中做任何事情就可以直接在記錄上加鎖、即完全依靠數(shù)據(jù)庫(kù)來(lái)管理鎖的工作。一般情況下,當(dāng)執(zhí)行事務(wù)處理時(shí)SQL Server會(huì)自動(dòng)對(duì)事務(wù)處理范圍內(nèi)更新到的表做鎖定。 
              2.悲觀鎖(Pessimistic Lock) 
              悲觀鎖對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的自動(dòng)管理不感冒,需要程序員直接管理數(shù)據(jù)或?qū)ο笊系募渔i處理,并負(fù)責(zé)獲取、共享和放棄正在使用的數(shù)據(jù)上的任何鎖。

          事務(wù)隔離級(jí)別
              
          一個(gè)事務(wù)必須與其它事務(wù)進(jìn)行隔離的程度。較低的隔離級(jí)別可以增加并發(fā),但代價(jià)是降低數(shù)據(jù)的正確性。相反,較高的隔離級(jí)別可以確保數(shù)據(jù)的正確性,但可能對(duì)并發(fā)產(chǎn)生負(fù)面影響。

          數(shù)據(jù)庫(kù)并發(fā)操作存在的異常情況:
          1. 更新丟失(Lost update):兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù)但是第二個(gè)事務(wù)卻中途失敗退出導(dǎo)致對(duì)數(shù)據(jù)兩個(gè)修改都失效了這是系統(tǒng)沒(méi)有執(zhí)行任何鎖操作因此并發(fā)事務(wù)并沒(méi)有被隔離開來(lái)

          2. 臟讀取(Dirty Reads):一個(gè)事務(wù)開始讀取了某行數(shù)據(jù)但是另外一個(gè)事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒(méi)有能夠及時(shí)提交。這是相當(dāng)危險(xiǎn)很可能所有操作都被回滾

          3. 不可重復(fù)讀取(Non-repeatable Reads):一個(gè)事務(wù)對(duì)同一行數(shù)據(jù)重復(fù)讀取兩次但是卻得到了不同結(jié)果。例如在兩次讀取中途有另外一個(gè)事務(wù)對(duì)該行數(shù)據(jù)進(jìn)行了修改并提交

          4. 兩次更新問(wèn)題(Second lost updates problem):無(wú)法重復(fù)讀取特例,有兩個(gè)并發(fā)事務(wù)同時(shí)讀取同一行數(shù)據(jù)然后其中一個(gè)對(duì)它進(jìn)行修改提交而另一個(gè)也進(jìn)行了修改提交這就會(huì)造成第一次寫操作失效

          5. 幻讀(Phantom Reads):也稱為幻像(幻影)。事務(wù)在操作過(guò)程中進(jìn)行兩次查詢,第二次查詢結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢SQL語(yǔ)句相同)這是因?yàn)樵趦纱尾樵冞^(guò)程中有另外一個(gè)事務(wù)插入數(shù)據(jù)造成的

          為了避免上面出現(xiàn)幾種情況在標(biāo)準(zhǔn)SQL規(guī)范中定義了4個(gè)事務(wù)隔離級(jí)別,不同隔離級(jí)別對(duì)事務(wù)處理不同 。

          1.未授權(quán)讀取(Read Uncommitted):也稱未提交讀。允許臟讀取但不允許更新丟失,如果一個(gè)事務(wù)已經(jīng)開始寫數(shù)據(jù)則另外一個(gè)數(shù)據(jù)則不允許同時(shí)進(jìn)行寫操作但允許其他事務(wù)讀此行數(shù)據(jù)。該隔離級(jí)別可以通過(guò)“排他寫鎖”實(shí)現(xiàn)。事務(wù)隔離的最低級(jí)別,僅可保證不讀取物理?yè)p壞的數(shù)據(jù)。與READ COMMITTED 隔離級(jí)相反,它允許讀取已經(jīng)被其它用戶修改但尚未提交確定的數(shù)據(jù)。

          2. 授權(quán)讀取(Read Committed):也稱提交讀。允許不可重復(fù)讀取但不允許臟讀取。這可以通過(guò)“瞬間共享讀鎖”和“排他寫鎖”實(shí)現(xiàn),讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)繼續(xù)訪問(wèn)該行數(shù)據(jù),但是未提交寫事務(wù)將會(huì)禁止其他事務(wù)訪問(wèn)該行。SQL Server 默認(rèn)的級(jí)別。在此隔離級(jí)下,SELECT 命令不會(huì)返回尚未提交(Committed) 的數(shù)據(jù),也不能返回臟數(shù)據(jù)。

          3. 可重復(fù)讀取(Repeatable Read):禁止不可重復(fù)讀取和臟讀取。但是有時(shí)可能出現(xiàn)幻影數(shù)據(jù),這可以通過(guò)“共享讀鎖”和“排他寫鎖”實(shí)現(xiàn),讀取數(shù)據(jù)事務(wù)將會(huì)禁止寫事務(wù)(但允許讀事務(wù)),寫事務(wù)則禁止任何其他事務(wù)。在此隔離級(jí)下,用SELECT 命令讀取的數(shù)據(jù)在整個(gè)命令執(zhí)行過(guò)程中不會(huì)被更改。此選項(xiàng)會(huì)影響系統(tǒng)的效能,非必要情況最好不用此隔離級(jí)。

          4. 串行(Serializable):也稱可串行讀。提供嚴(yán)格的事務(wù)隔離,它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過(guò)“行級(jí)鎖”是無(wú)法實(shí)現(xiàn)事務(wù)序列化的,必須通過(guò)其他機(jī)制保證新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢操作事務(wù)訪問(wèn)到。事務(wù)隔離的最高級(jí)別,事務(wù)之間完全隔離。如果事務(wù)在可串行讀隔離級(jí)別上運(yùn)行,則可以保證任何并發(fā)重疊事務(wù)均是串行的。


          隔離級(jí)別 更新丟失 臟讀取 重復(fù)讀取 幻讀
          未授權(quán)讀取 N Y Y Y
          授權(quán)讀取 N N Y Y
          可重復(fù)讀取 N N N Y
          串行 N N N N



          Blog : http://agapple.javaeye.com/  歡迎訪問(wèn)
          posted on 2009-02-15 21:47 agapple 閱讀(6398) 評(píng)論(1)  編輯  收藏 所屬分類: 雜類

          Feedback

          # re: 事務(wù)隔離級(jí)別小記 2010-08-19 14:55 人字拖
          good  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 延津县| 洛扎县| 巨鹿县| 墨竹工卡县| 澜沧| 安乡县| 淮阳县| 松阳县| 新邵县| 江都市| 临城县| 治多县| 玉环县| 上高县| 南充市| 永嘉县| 广平县| 衡南县| 江川县| 大丰市| 开封县| 察雅县| 酉阳| 新沂市| 宁都县| 平乐县| 景洪市| 夏河县| 永寿县| 石柱| 玛纳斯县| 卢湾区| 柳河县| 博野县| 新宾| 綦江县| 株洲县| 盘锦市| 罗城| 曲阜市| 龙泉市|