Java中JDBC進階教程之資料庫的隔離級別!

千鋒武漢發表於2021-06-18

  對資料庫而言,其明顯的特徵是資源可以被多個使用者共享。當相同的資料庫資源被多個使用者(多個事務)同時訪問時,如果沒有采取必要的隔離措施,就會導致各種併發問題,破壞資料的完整性。

  如果不考慮隔離性,資料庫將會存在三種併發問題。

   1. 髒讀

  一個事務讀到了另一個事務尚未提交的更改資料。例如,事務T1修改某一資料後,事務T2讀取同一資料,然後事務T1由於某種原因被撤消,這時T1已修改過的資料恢復原值,T2讀到的資料就與資料庫中的資料不一致,其讀到的資料就為"髒"資料,對該資料的操作也無法承認。

   2. 不可重複讀

  不可重複讀是指一個事務讀取資料後,另一個事務執行更新操作,使第一個事務無法再現前一次的讀取結果。例如,事務T1讀取B=100進行運算,事務T2讀取同一資料B,對其進行修改後將B=200寫回資料庫。這時,T1為了對讀取值校對重讀B,B已為200,與第一次讀取值不一致。

   3. 幻讀

  幻讀是指一個事務讀取資料後,另一個事務執行插入操作,使第一個事務無法再現前一次的讀取結果。例如,事務T1兩次統計所有賬戶的總金額,在這期間,事務T2插入了一條新記錄,使得兩次統計的總金額不一致。

  為了解決併發造成的問題,資料庫規範定義了四種隔離級別,用於限定事務之間的可見性,不同事務隔離級別能夠解決的資料併發問題的能力是不同的,具體如表2.1所示。

  表2.1 資料庫的隔離級別

1

  read uncommitted (讀未提交),一個事務讀到另一個事務沒有提交的資料。

  read committed (讀已提交),一個事務讀到另一個事務已經提交的資料。

  repeatable read (可重複讀),在一個事務中讀到的資料始終一致,無論別的事務是否提交。

  serializable(序列化),同時只能執行一個事務,相當於是事務中的單執行緒。

  以上四種隔離級別安全性最高的是serializable (序列化),最低的是read uncommitted(讀未提交),當然安全效能越高,執行效率就越低。像serializable(序列化)這樣的級別,就是以鎖表的方式,使得其他的事務只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。MySQL資料庫預設的隔離級別為repeatable read (可重複讀)。


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

相關文章