概念:事務的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的失去,不能被其他事務的操作數據所干擾,多個并發事務之間要相互隔離。
多個線程開啟各自事務操作數據庫中數據時,數據庫系統要負責隔離操作,以保證各個線程在獲取數據時的準確性。
如果不考慮隔離性,可能會引發如下問題:
1、臟讀:是指一個事務讀取了另一個事務沒有提交的數據。
假如A和B各自有100元錢,A向B轉了100元錢,執行update account set money=money+100 while name=‘b’;update account set money=money-100 while name=‘a’;當第一條執行完,第二條還沒執行,B查詢自己的賬戶,就會發現自己的賬戶多了100元,如果此時A再回滾自己的操作,那么B之后再查詢自己的賬戶,就會發現自己的錢和之前并沒有變化,還是100
2、不可重復讀
在一個事務內讀取表中的某一行數據,多次讀取結果不相同。
還是上面那個例子,轉賬之前,銀行查詢A的賬戶是100元錢,A向B轉了100之后,銀行 對應上面兩個sql語句并且已經提交,又查詢A賬戶,發現是0元。這就導致了兩次查詢結果不相同。
注意:不可重復讀有時候是正確的,就像這種情況,正是實際情況需要的,然而有時,不可重復讀是不正確的,比如對某個地區統計GDP,兩次查詢結果不一樣,該怎么報道呢?所以這種情況又是錯誤的。
不可重復讀和臟讀的區別,臟讀是讀取前一事務未提交的臟數據,不可重復讀是重新讀取了前一事務已經提交的數據。
3、虛讀:是指在一個事務內讀取到了別的事務插入的數據,導致前后讀取不一致。
假如一個人存款100元沒有提交,這時銀行做報表統計所有用戶的總額為600元,然后這個人提交了這時銀行再統計發現賬戶為700元了,這就是虛讀。
說了問題,那么怎么避免這些問題呢?請看我另一篇博客
新聞熱點
疑難解答