Java中JDBC进阶教程之数据库的隔离级别!
對數據庫而言,其明顯的特征是資源可以被多個用戶共享。當相同的數據庫資源被多個用戶(多個事務)同時訪問時,如果沒有采取必要的隔離措施,就會導致各種并發問題,破壞數據的完整性。
如果不考慮隔離性,數據庫將會存在三種并發問題。
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 數據庫的隔離級別
read uncommitted (讀未提交),一個事務讀到另一個事務沒有提交的數據。
read committed (讀已提交),一個事務讀到另一個事務已經提交的數據。
repeatable read (可重復讀),在一個事務中讀到的數據始終一致,無論別的事務是否提交。
serializable(串行化),同時只能執行一個事務,相當于是事務中的單線程。
以上四種隔離級別安全性最高的是serializable (串行化),最低的是read uncommitted(讀未提交),當然安全性能越高,執行效率就越低。像serializable(串行化)這樣的級別,就是以鎖表的方式,使得其他的事務只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。MySQL數據庫默認的隔離級別為repeatable read (可重復讀)。
原文來自千鋒教育:http://wh.mobiletrain.org/,轉載請注明出處。
總結
以上是生活随笔為你收集整理的Java中JDBC进阶教程之数据库的隔离级别!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DOM和Diff算法你应该知道的那些事,
- 下一篇: 学习Python必须具备的五大技能!