Oracle 資料庫隔離級別,特性,問題和解決方法

xingfei80發表於2012-08-31

引自:http://www.cnblogs.com/1-2-3/archive/2012/04/05/oracle-isolation-level-ora-08177.html

“……老手根本就不會照著指示去做,他邊做邊取捨,因此必須全神貫注於手上的工作,即使他沒有刻意這樣做,他的動作和機器之間也自然有一種和諧的感覺。他不需要遵照任何書面的指示,因為手中的機器給他的感覺決定他的思路和動作,同時也影響他手中的工作。所以機器和他的思想同時不斷地改變,一直到把事情做好了,他的內心才真正地安寧下來。”
  “聽起來好像藝術一樣。”
                  ——羅伯特·M.波西格 《禪與摩托車維修藝術》

[@more@]如果沒有任何資料庫隔離策略,在多使用者(多事務)併發時,會產生下列問題:
  - 丟失更新(lost update):兩個事務同時更新同一條資料時,會發生更新丟失。
    例如:使用者A讀取學號為107的學生(學號=107,姓名=“小明”,年齡=28)
    => 使用者B讀取學號為107的學生(學號=107,姓名=“小明”,年齡=28)
    => 使用者A把姓名更改為“王小明”(學號=107,姓名=“王小明”,年齡=28)
    => 使用者B把年齡更改為33(學號=107,姓名=“小明”,年齡=33
    => 使用者A提交(學號=107,姓名=“王小明”,年齡=28)
    => 使用者B提交(學號=107,姓名=“小明”,年齡=33
    使用者A對學生姓名的更新丟失了。
  - 髒讀(dirty read):當一個事務讀取另一個事務尚未提交的修改時,產生髒讀。
    例如:使用者A讀取學號為107的學生(學號=107,姓名=“小明”,年齡=28)
    => 使用者A把姓名更改為“王小明”(學號=107,姓名=“王小明”,年齡=28)
    => 使用者B讀取學號為107的學生(學號=107,姓名=“王小明”,年齡=28)
    => 使用者A撤銷更改,事務回滾(學號=107,姓名=“小明”,年齡=28)
    這樣使用者B相當於讀取了一個從未存在過的資料“王小明”。如果涉及到金額的話問題更為嚴重,因為使用者B讀取了一個金額之後,很可能把這個金額與其它金額累加,再把結果儲存到彙總資料之中,這樣在月底對不上賬的時候,由於使用者A回滾了事務,資料庫內不會有任何操作記錄,這樣使用者B是何時、從哪裡讀取了錯誤資料根本無從查起。
  - 不可重現的讀取(nonrepeatable read):同一查詢在同一事務中多次進行,在此期間,由於其他事務提交了對資料的修改或刪除,每次返回不同的結果。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14663377/viewspace-1059305/,如需轉載,請註明出處,否則將追究法律責任。

相關文章