一個數據庫可能擁有多個訪問客戶端,這些客戶端併發訪問數據庫時,若沒有采起必要的隔離措施,存在如下問題,這些問題分爲5類,包括3類數據讀問題:髒讀、不可重複讀和幻讀。兩類數據更新問題:第一類丟失更新、第二類丟失更新。sql
1.髒讀
A事務讀取B事務還沒有提交的更改數據,並在這個數據的基礎上進行操做,這時候若是事務B回滾,那麼A事務讀到的數據是不被認可的。例如常見的取款事務和轉帳事務: 數據庫
2.不可重複讀
不可重複讀是指A事務讀取了B事務已經提交的更改數據。假如A在取款事務的過程當中,B往該帳戶轉帳100,A兩次讀取的餘額發生不一致。併發
3.幻讀
A事務讀取B事務提交的新增數據,會引起幻讀問題。幻讀通常發生在計算統計數據的事務中,例如銀行系統在同一個事務中兩次統計存款帳戶的總金額,在兩次統計中,恰好新增了一個存款帳戶,存入了100,這時候兩次統計的總金額不一致。 oracle
注意:不可重複讀和幻讀的區別是:前者是指讀到了已經提交的事務的更改數據(修改或刪除),後者是指讀到了其餘已經提交事務的新增數據。對於這兩種問題解決採用不一樣的辦法,防止讀到更改數據,只需對操做的數據添加行級鎖,防止操做中的數據發生變化;二防止讀到新增數據,每每須要添加表級鎖,將整張表鎖定,防止新增數據(oracle採用多版本數據的方式實現)。3d
4.第一類丟失更新
A事務撤銷時,把已經提交的B事務的更新數據覆蓋了。例如: 對象
這時候取款事務A撤銷事務,餘額恢復爲1000,這就丟失了更新。blog
5.第二類丟失更新
A事務覆蓋B事務已經提交的數據,形成B事務所作的操做丟失 事務
爲了解決上述問題,數據庫經過鎖機制解決併發訪問的問題。根據鎖定對象不一樣:分爲行級鎖和表級鎖;根據併發事務鎖定的關係上看:分爲共享鎖定和獨佔鎖定,共享鎖定會防止獨佔鎖定但容許其餘的共享鎖定。而獨佔鎖定既防止共享鎖定也防止其餘獨佔鎖定。爲了更改數據,數據庫必須在進行更改的行上施加行獨佔鎖定,insert、update、delete和selsct for update語句都會隱式採用必要的行鎖定。class
可是直接使用鎖機制管理是很複雜的,基於鎖機制,數據庫給用戶提供了不一樣的事務隔離級別,只要設置了事務隔離級別,數據庫就會分析事務中的sql語句而後自動選擇合適的鎖。
不一樣的隔離級別對併發問題的解決狀況如圖: 基礎
注意:事務的隔離級別和數據庫併發性是成反比的,隔離級別越高,併發性越低。