爪哇咖啡館

          我為J狂

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            11 隨筆 :: 2 文章 :: 39 評(píng)論 :: 0 Trackbacks
          <2014年2月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          2324252627281
          2345678

          常用鏈接

          留言簿(2)

          隨筆檔案(11)

          文章檔案(2)

          新聞檔案(1)

          我的文章

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          臟讀 dirty   reads:當(dāng)事務(wù)讀取還未被提交的數(shù)據(jù)時(shí),就會(huì)發(fā)生這種事件。舉例來說:Transaction   1   修改了一行數(shù)據(jù),然后   Transaction   2   在   Transaction   1   還未提交修改操作之前讀取了被修改的行。如果   Transaction   1   回滾了修改操作,那么   Transaction   2   讀取的數(shù)據(jù)就可以看作是從未存在過的。     
            不可重復(fù)的讀 non-repeatable   reads:當(dāng)事務(wù)兩次讀取同一行數(shù)據(jù),但每次得到的數(shù)據(jù)都不一樣時(shí),就會(huì)發(fā)生這種事件。舉例來說:Transaction   1   讀取一行數(shù)據(jù),然后   Transaction   2   修改或刪除該行并提交修改操作。當(dāng)   Transaction   1   試圖重新讀取該行時(shí),它就會(huì)得到不同的數(shù)據(jù)值(如果該行被更新)或發(fā)現(xiàn)該行不再存在(如果該行被刪除)。     
            虛讀 phantom   read:如果符合搜索條件的一行數(shù)據(jù)在后面的讀取操作中出現(xiàn),但該行數(shù)據(jù)卻不屬于最初的數(shù)據(jù),就會(huì)發(fā)生這種事件。舉例來說:Transaction   1   讀取滿足某種搜索條件的一些行,然后   Transaction   2   插入了符合   Transaction   1   的搜索條件的一個(gè)新行。如果   Transaction   1   重新執(zhí)行產(chǎn)生原來那些行的查詢,就會(huì)得到不同的行。


          事務(wù)場(chǎng)景是這樣的:
          對(duì)于同一個(gè)銀行帳戶A內(nèi)有200元,甲進(jìn)行提款操作100元,乙進(jìn)行轉(zhuǎn)帳操作100元到B帳戶。如果事務(wù)沒有進(jìn)行隔離可能會(huì)并發(fā)如下問題:
          1、第一類丟失更新:首先甲提款時(shí)帳戶內(nèi)有200元,同時(shí)乙轉(zhuǎn)帳也是200元,然后甲乙同時(shí)操作,甲操作成功取走100元,乙操作失敗回滾,帳戶內(nèi)最終為200元,這樣甲的操作被覆蓋掉了,銀行損失100元。
          2、臟讀:甲取款100元未提交,乙進(jìn)行轉(zhuǎn)帳查到帳戶內(nèi)剩有100元,這是甲放棄操作回滾,乙正常操作提交,帳戶內(nèi)最終為0元,乙讀取了甲的臟數(shù)據(jù),客戶損失100元。
          3、虛讀:和臟讀類似,是針對(duì)于插入操作過程中的讀取問題,如丙存款100元未提交,這時(shí)銀行做報(bào)表進(jìn)行統(tǒng)計(jì)查詢帳戶為200元,然后丙提交了,這時(shí)銀行再統(tǒng)計(jì)發(fā)現(xiàn)帳戶為300元了,無法判斷到底以哪個(gè)為準(zhǔn)?
           大家好像覺得統(tǒng)計(jì)這個(gè)東西肯定是時(shí)時(shí)更新的,這種情況很正常;但是如果統(tǒng)計(jì)是在一個(gè)事務(wù)中的時(shí)候就不正常了,比如我們的一個(gè)統(tǒng)計(jì)應(yīng)用需要將統(tǒng)計(jì)結(jié)果分別輸出到電腦屏幕和遠(yuǎn)程網(wǎng)絡(luò)某臺(tái)計(jì)算機(jī)的磁盤文件中,為了
           提高性能和用戶響應(yīng)我們分成2個(gè)線程,這時(shí)先完成的和后完成的統(tǒng)計(jì)數(shù)據(jù)就可能不一致,我們就不知道以哪個(gè)為準(zhǔn)了。
          4、不可重復(fù)讀:甲乙同時(shí)開始都查到帳戶內(nèi)為200元,甲先開始取款100元提交,這時(shí)乙在準(zhǔn)備最后更新的時(shí)候又進(jìn)行了一次查詢,發(fā)現(xiàn)結(jié)果是100元,這時(shí)乙就會(huì)很困惑,不知道該將帳戶改為100還是0。
          和臟讀的區(qū)別是,臟讀是讀取前一事務(wù)未提交的臟數(shù)據(jù),不可重復(fù)讀是重新讀取了前一事務(wù)已提交的數(shù)據(jù)。
          5、第二類丟失更新:是不可重復(fù)讀的一種特例,如上,乙不做第二次查詢而是直接操作完成,帳戶內(nèi)最終為100元,甲的操作被覆蓋掉了,銀行損失100元。感覺和第一類丟失更新類似。


          在多個(gè)事務(wù)并發(fā)做數(shù)據(jù)庫操作的時(shí)候,如果沒有有效的避免機(jī)制,就會(huì)出現(xiàn)種種問題。大體上有三種問題,歸結(jié)如下:
          1、丟失更新
          如果兩個(gè)事務(wù)都要更新數(shù)據(jù)庫一個(gè)字段X,x=100
          事務(wù)A             事務(wù)B
          讀取X=100    
                            讀取X=100
          寫入x=X+100
                            寫入x=X+200
          事務(wù)結(jié)束x=200
                            事務(wù)結(jié)束x=300
          最后x==300
          這種情況事務(wù)A的更新就被覆蓋掉了、丟失了。
          丟失更新說明事務(wù)進(jìn)行數(shù)據(jù)庫寫操作的時(shí)候可能會(huì)出現(xiàn)的問題。
          2、不可重復(fù)讀
          一個(gè)事務(wù)在自己沒有更新數(shù)據(jù)庫數(shù)據(jù)的情況,同一個(gè)查詢操作執(zhí)行兩次或多次的結(jié)果應(yīng)該是一致的;如果不一致,就說明為不可重復(fù)讀。
          還是用上面的例子
          事務(wù)A             事務(wù)B
          讀取X=100    
                            讀取X=100
          讀取X=100    
                            寫入x=X+100
          讀取X=200    
          事務(wù)結(jié)束x=200
                            事務(wù)結(jié)束x=200
          這種情況事務(wù)A多次讀取x的結(jié)果出現(xiàn)了不一致,即為不可重復(fù)讀。
          再有一情況就是幻影
          事務(wù)A讀的時(shí)候讀出了15條記錄,事務(wù)B在事務(wù)A執(zhí)行的過程中刪除(增加)了1條,事務(wù)A再讀的時(shí)候就變成了14(16)條,這種情況就叫做幻影讀。
          不可重復(fù)讀說明了做數(shù)據(jù)庫讀操作的時(shí)候可能會(huì)出現(xiàn)的問題。
          3、臟讀(未提交讀)
          防止一個(gè)事務(wù)讀到另一個(gè)事務(wù)還沒有提交的記錄。
          如:
          事務(wù)A             事務(wù)B
                            讀取X=100
                            寫入x=X+100
          讀取X=200    
                            事務(wù)回滾x=100
          讀取X=100    
          事務(wù)結(jié)束x=100

          x鎖 排他鎖 被加鎖的對(duì)象只能被持有鎖的事務(wù)讀取和修改,其他事務(wù)無法在該對(duì)象上加其他鎖,也不能讀取和修改該對(duì)象
          s鎖 共享鎖 被加鎖的對(duì)象可以被持鎖事務(wù)讀取,但是不能被修改,其他事務(wù)也可以在上面再加s鎖。
          封鎖協(xié)議:
          一級(jí)封鎖協(xié)議:
          在事務(wù)修改數(shù)據(jù)的時(shí)候加x鎖,直到事務(wù)結(jié)束(提交或者回滾)釋放x鎖。一級(jí)封鎖協(xié)議可以有效的防止丟失更新,但是不能防止臟讀不可重復(fù)讀的出現(xiàn)。
          二級(jí)封鎖協(xié)議:
          在一級(jí)封鎖的基礎(chǔ)上事務(wù)讀數(shù)據(jù)的時(shí)候加s鎖,讀取之后釋放。二級(jí)封鎖協(xié)議可以防止丟失更新,臟讀。不能防止不可重復(fù)讀。
          三級(jí)封鎖協(xié)議:
          在一級(jí)封鎖的基礎(chǔ)上事務(wù)讀數(shù)據(jù)的時(shí)候加s鎖,直到事務(wù)結(jié)束釋放。二級(jí)封鎖協(xié)議可以防止丟失更新,臟讀,不可重復(fù)讀。

          posted on 2007-04-23 20:07 哲藤峰子 閱讀(5579) 評(píng)論(8)  編輯  收藏

          評(píng)論

          # re: 多角度徹底理解數(shù)據(jù)庫事務(wù)中的"臟讀"."不可重復(fù)的讀"及"虛讀" 2007-09-23 18:07 qtnez
          非常感謝,讀了清楚多了  回復(fù)  更多評(píng)論
            

          # re: 多角度徹底理解數(shù)據(jù)庫事務(wù)中的"臟讀"."不可重復(fù)的讀"及"虛讀" 2007-10-13 16:02 yliang22
          對(duì)于同一個(gè)銀行帳戶A內(nèi)有200元,甲進(jìn)行提款操作100元,乙進(jìn)行轉(zhuǎn)帳操作100元到B帳戶。如果事務(wù)沒有進(jìn)行隔離可能會(huì)并發(fā)如下問題:
          如果事務(wù)沒有進(jìn)行隔離可能會(huì)并發(fā)如下問題:這句話是有問題的。事務(wù)的隔離級(jí)別不同會(huì)發(fā)生下面的問題。  回復(fù)  更多評(píng)論
            

          # re: 多角度徹底理解數(shù)據(jù)庫事務(wù)中的"臟讀"."不可重復(fù)的讀"及"虛讀" 2008-02-22 15:03 bizairshop
          寫的很好 http://www.newskyair.com 機(jī)票推薦  回復(fù)  更多評(píng)論
            

          # re: 多角度徹底理解數(shù)據(jù)庫事務(wù)中的"臟讀"."不可重復(fù)的讀"及"虛讀"[未登錄] 2008-04-20 10:10 ggg
          dhjdshakHDFSAKJDHSA
            回復(fù)  更多評(píng)論
            

          # re: 多角度徹底理解數(shù)據(jù)庫事務(wù)中的"臟讀"."不可重復(fù)的讀"及"虛讀"[未登錄] 2008-04-20 10:11 ggg
          從表面和純理論方法分析了,沒有結(jié)果到實(shí)際的應(yīng)用來分析。  回復(fù)  更多評(píng)論
            

          # re: 多角度徹底理解數(shù)據(jù)庫事務(wù)中的"臟讀"."不可重復(fù)的讀"及"虛讀" 2013-03-01 15:29 未來城市
          很好,很強(qiáng)大  回復(fù)  更多評(píng)論
            

          # re: 多角度徹底理解數(shù)據(jù)庫事務(wù)中的"臟讀"."不可重復(fù)的讀"及"虛讀" 2013-03-01 15:37 未來城市
          寫的真好  回復(fù)  更多評(píng)論
            

          # re: 多角度徹底理解數(shù)據(jù)庫事務(wù)中的"臟讀"."不可重復(fù)的讀"及"虛讀"[未登錄] 2014-02-13 11:34 kurt
          "在一級(jí)封鎖的基礎(chǔ)上事務(wù)讀數(shù)據(jù)的時(shí)候加s鎖,"既然加了X鎖其它事物連read都不成,為何還要加S鎖呢?  回復(fù)  更多評(píng)論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 滦南县| 西畴县| 常山县| 广灵县| 临猗县| 延寿县| 宁武县| 米林县| 宁明县| 江陵县| 徐汇区| 惠东县| 英超| 枣庄市| 延庆县| 大冶市| 万山特区| 襄樊市| 定西市| 兴化市| 闸北区| 乡宁县| 景德镇市| 随州市| 北流市| 齐齐哈尔市| 竹山县| 高密市| 卓资县| 得荣县| 驻马店市| 洪江市| 庐江县| 龙胜| 揭东县| 冀州市| 江门市| 夏河县| 哈尔滨市| 凤冈县| 乌拉特后旗|