隨筆-14  評論-142  文章-0  trackbacks-0
            2009年4月13日

          1, 臟讀

          一個事務讀到另一個事務,尚未提交的修改,就是臟讀。這里所謂的修改,除了Update操作,不要忘了,還包括
          Insert和Delete操作。

          臟讀的后果:如果后一個事務回滾,那么它所做的修改,統統都會被撤銷。前一個事務讀到的數據,就是垃圾數據。


          舉個例子:預訂房間。
          有一張Reservation表,往表中插入一條記錄,來訂購一個房間。

           事務1:在Reservation表中插入一條記錄,用于預訂99號房間。

           事務2:查詢,尚未預定的房間列表,因為99號房間,已經被事務1預訂。所以不在列表中。

           事務1:信用卡付款。由于付款失敗,導致整個事務回滾。
                  所以插入到Reservation 表中的記錄并不置為持久(即它將被刪除)。

          現在99號房間則為可用。
          所以,事務2所用的是一個無效的房間列表,因為99號房間,已經可用。如果它是最后一個沒有被預定的房間,那么這將是一個嚴重的失誤。

          注:臟讀的后果很嚴重。

           

          2,不可重復讀。

          在同一個事務中,再次讀取數據時【就是你的select操作】,所讀取的數據,和第1次讀取的數據,不一樣了。就是不可重復讀。

          舉個例子:
           事務1:查詢有雙人床房間。99號房間,有雙人床。

           事務2:將99號房間,改成單人床房間。

           事務1:再次執行查詢,請求所有雙人床房間列表,99號房間不再列表中了。也就是說,
                         事務1,可以看到其他事務所做的修改。


          在不可重復讀,里面,可以看到其他事務所做的修改,而導致2次的查詢結果不再一樣了。
          這里的修改,是提交過的。也可以是沒有提交的,這種情況同時也是臟讀。

          如果,數據庫系統的隔離級別。允許,不可重復讀。那么你啟動一個事務,并做一個select查詢操作。
          查詢到的數據,就有可能,和你第2次,3次...n次,查詢到的數據不一樣。一般情況下,你只會做一次,select
          查詢,并以這一次的查詢數據,作為后續計算的基礎。因為允許出現,不可重復讀。那么任何
          時候,查詢到的數據,都有可能被其他事務更新,查詢的結果將是不確定的。


          注:如果允許,不可重復讀,你的查詢結果,將是不確定的。一個不確定的結果,你能容忍嗎?


          3,幻讀

           

          事務1讀取指定的where子句所返回的一些行。然后,事務2插入一個新行,這個新行也滿足事務1使用的查詢
          where子句。然后事務1再次使用相同的查詢讀取行,但是現在它看到了事務2剛插入的行。這個行被稱為幻象,
          因為對事務1來說,這一行的出現是不可思議的。

          舉個例子:
          事務1:請求沒有預定的,雙人床房間列表。
          事務2:向Reservation表中插入一個新紀錄,以預訂99號房間,并提交。
          事務1:再次請求有雙人床的未預定的房間列表,99號房間,不再位于列表中。


          注:幻讀,針對的是,Insert操作。如果事務2,插入的記錄,沒有提交。那么同時也是臟讀。

           

           

           

           

           

           


           

          posted @ 2009-04-13 12:37 liulang 閱讀(7335) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 龙岩市| 平罗县| 宁陕县| 安达市| 柳河县| 镶黄旗| 海淀区| 谷城县| 通辽市| 项城市| 突泉县| 鸡东县| 乐陵市| 皮山县| 玉田县| 苍山县| 驻马店市| 墨竹工卡县| 宁安市| 太原市| 肃南| 敖汉旗| 威宁| 都安| 织金县| 鹿邑县| 保亭| 平武县| 台州市| 紫阳县| 永安市| 迭部县| 新沂市| 乌鲁木齐县| 离岛区| 云和县| 青阳县| 汨罗市| 新化县| 宁远县| 垫江县|