事務的特性: 原子性 一致性 持久性 隔離性 併發產生的錯誤: 五、事務的隔離級別 多個線程開啟各自事務操作資料庫中數據時,資料庫系統要負責隔離操作,以保證各個線程在獲取數據時的準確性。 5.1、事務不考慮隔離性可能會引發的問題 如果事務不考慮隔離性,可能會引發如下問題: 1、臟讀 臟讀指一個事務讀 ...
事務的特性: 原子性 一致性 持久性 隔離性 併發產生的錯誤:
五、事務的隔離級別
多個線程開啟各自事務操作資料庫中數據時,資料庫系統要負責隔離操作,以保證各個線程在獲取數據時的準確性。5.1、事務不考慮隔離性可能會引發的問題
如果事務不考慮隔離性,可能會引發如下問題:1、臟讀
臟讀指一個事務讀取了另外一個事務未提交的數據。 這是非常危險的,假設A向B轉帳100元,對應sql語句如下所示 1.update account set money=money+100 where name='B'; 2.update account set money=money-100 where name='A'; 當第1條sql執行完,第2條還沒執行(A未提交時),如果此時B查詢自己的帳戶,就會發現自己多了100元錢。如果A等B走後再回滾,B就會損失100元。2、不可重覆讀
不可重覆讀指在一個事務內讀取表中的某一行數據,多次讀取結果不同。 例如銀行想查詢A帳戶餘額,第一次查詢A帳戶為200元,此時A向帳戶記憶體了100元並提交了,銀行接著又進行了一次查詢,此時A帳戶為300元了。銀行兩次查詢不一致,可能就會很困惑,不知道哪次查詢是準的。 不可重覆讀和臟讀的區別是,臟讀是讀取前一事務未提交的臟數據,不可重覆讀是重新讀取了前一事務已提交的數據。 很多人認為這種情況就對了,無須困惑,當然是後面的為準。我們可以考慮這樣一種情況,比如銀行程式需要將查詢結果分別輸出到電腦屏幕和寫到文件中,結果在一個事務中針對輸出的目的地,進行的兩次查詢不一致,導致文件和屏幕中的結果不一致,銀行工作人員就不知道以哪個為準了。3、虛讀(幻讀)
虛讀(幻讀)是指在一個事務內讀取到了別的事務插入的數據,導致前後讀取不一致。 如丙存款100元未提交,這時銀行做報表統計account表中所有用戶的總額為500元,然後丙提交了,這時銀行再統計發現帳戶為600元了,造成虛讀同樣會使銀行不知所措,到底以哪個為準。 隔離級別: 8-串列化 4-可重覆讀 2-可讀已提交 1-可讀未提交
