數據庫中多個事務訪問同一行數據的時候,可能會致使各類併發問題,破壞數據的完整性。這些問題能夠歸結爲5類,包括3類數據讀問題( 髒讀、 不可重複讀和幻象讀)以及2類數據更新問題( 第一類丟失更新和 第二類丟失更新)數據庫
1、數據讀問題併發
1.髒讀(dirty read):A事務讀取B事務還沒有提交的更改數據,並在這個數據的基礎上操做。若是恰巧B事務回滾,那麼A事務讀到的數據根本是不被認可的。事務
例:假設原帳戶1000元,(B開啓事務,A開啓事務),B查詢餘額1000元,B取出500元餘額更新爲500元,而A查詢餘額500元(髒讀),B撤銷事務餘額恢復1000元,A往相同的帳戶中轉帳100元(提交事務)。table
結果:餘額更新爲600元,由於A事務讀取了B事務還沒有提交的數據,於是形成帳戶白白丟失了500元!基礎
2.不可重複讀(unrepeatable read):不可重複讀是指 A事務讀取了B事務已經提交的更改數據。date
例:假設原帳戶1000元,(B開啓事務,A開啓事務),B查詢餘額爲1000元,A查詢餘額爲1000元,A在取款事務的過程當中,B往該帳戶轉帳100元且餘額更新爲1100元(提交事務),A再次查詢餘額爲1100元。統計
結果:A兩次讀取帳戶的餘額發生不一致(第一次1000元,第二次1100元)!數據
3.幻象讀(phantom read):A事務讀取B事務提交的新增數據,這時A事務將出現幻象讀的問題。查詢
例:假設銀行系統在同一個事務中,(B開啓事務,A開啓事務),A統計總存款數10000元,B新增一個帳號,並存入100元(B提交事務),A再次統計總存款數爲10100元。tab
結果:兩次統計存款帳戶的總金額,在兩次統計過程當中,恰好新增了一個存款帳戶,並存入100元,這時,兩次統計的總金額將不一致
幻象讀和不可重複讀區別:前者是指讀到了其餘已經提交事務的新增數據,然後者是指讀到了已經提交事務的更改數據(更改或刪除),爲了不這兩種狀況,採起的對策是不一樣的,防止讀取到更改數據,只須要對操做的數據添加行級鎖,阻止操做中的數據發生變化,而防止讀取到新增數據,則每每須要添加表級鎖——將整個表鎖定,防止新增數據。
2、2類數據更新問題
1.第一類丟失更新(回滾丟失,Lost update):A事務撤銷時,把已經提交的B事務的更新數據覆蓋了。
標準定義的全部隔離界別都不容許第一類丟失更新發生
例如:假設帳戶餘額1000元,(A開啓事務,B開啓事務)A查詢餘額爲1000元,B查詢餘額爲1000元且轉入100元(B提交事務),A取出100元餘額更新爲900元(A撤銷事務)。
結果:最終餘額更新爲1000元,A在撤銷事務的時候,B轉入金額丟失了!
2.第二類丟失更新(覆蓋丟失/兩次更新問題,Second lost update):A事務覆蓋B事務已經提交的數據,形成B事務所作操做丟失。
第二類丟失更新,實際上和不可重複讀是同一種問題!!
例如:假設帳戶餘額爲1000元,(B開啓事務,A開啓事務),B查詢餘額爲1000元,A查詢餘額爲1000元,B取出100元將餘額更新爲900元(B提交事務),A匯入100元(A提交事務)。
結果:餘額更新爲1100元,致使銀行損失100元!