多個執行緒開啟各自事務運算元據庫中資料時,資料庫系統要負責隔離操作,以保證各個執行緒在獲取資料時的準確性。
如果不考慮隔離性,可能會引發如下問題:
(1)髒讀:
指乙個事務讀取了另外乙個事務未提交的資料。
這是非常危險的,假設a向b轉帳100元,對應
sql語句如下所示
1.update account set money=money+100 while name=『b』
;2.update account set money=money-100 while name=『a』
;當第1條
sql執行完,第
2條還沒執行
(a未提交時
),如果此時b查詢自己的帳戶,就會發現自己多了
100元錢。如果a等
b走後再回滾,
b就會損失
100元。
(2)不可重複讀:
在乙個事務內讀取表中的某一行資料,多次讀取結果不同。(主要發生在update語句)
例如銀行想查詢a帳戶餘額,第一次查詢
a帳戶為
200元,此時
a向帳戶存了
100元並提交了,銀行接著又進行了一次查詢,此時
a帳戶為
300元了。銀行兩次查詢不一致,可能就會很困惑,不知道哪次查詢是準的。
和髒讀的區別是,髒讀是讀取前一事務未提交的髒資料,不可重複讀是重新讀取了前一事務已提交的資料。
很多人認為這種情況就對了,無須困惑,當然是後面的為準。我們可以考慮這樣一種情況,比如銀行程式需要將查詢結果分別輸出到電腦螢幕和寫到檔案中,結果在乙個事務中針對輸出的目的地,進行的兩次查詢不一致,導致檔案和螢幕中的結果不一致,銀行工作人員就不知道以哪個為準了。
(3)虛讀(幻讀
)是指在乙個事務內讀取到了別的事務插入的資料,導致前後讀取不一致。(主要發生在insert語句)
如丙存款100元未提交,這時銀行做報表統計
account
表中所有使用者的總額為
500元,然後丙提交了,這時銀行再統計發現帳戶為
600元了,造成虛讀同樣會使銀行不知所措,到底以哪個為準。
(1)資料庫共定義了四種隔離級別:
n serializable:可避免髒讀、不可重複讀、虛讀情況的發生。(序列化)
n repeatable read:可避免髒讀、不可重複讀情況的發生。不可以避免虛讀(可重複讀,預設的隔離級別)
n read committed:可避免髒讀情況發生(讀已提交)
n read uncommitted:最低級別,以上情況均無法保證。
(讀未提交
)(2)檢視與設定當前的事物級別:
以下命令在mysql資料庫的控制台中執行。
set session transaction isolation level 設定事務隔離級別
select @@tx_isolation 查詢當前事務隔離級別
例如:
事務特性(ACID)
原子性 是指事務乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。不能夠單獨執行。把一組操作放入事務中 一致性 事務的執行的前後,資料的完整性要得到保證。隔離性 強調的是多個使用者併發訪問資料庫的時候,乙個使用者事務不能被其他使用者的事務所干擾到,多個併發事務之間的資料要相互隔離。解決多...
事務ACID特性
所謂事務,它是乙個操作序列,這些操作要麼都執行,要麼都不執行,它是乙個不可分割的工作單位。例如,銀行轉帳工作 從乙個帳號扣款並使另乙個帳號增款,這兩個操作要麼都執行,要麼都不執行。資料庫事務必須具備acid特性,acid是atomic 原子性 consistency 一致性 isolation 隔離...
事務ACID特性
所謂事務,它是乙個操作序列,這些操作要麼都執行,要麼都不執行,它是乙個不可分割的工作單位。例如,銀行轉帳工作 從乙個帳號扣款並使另乙個帳號增款,這兩個操作要麼都執行,要麼都不執行。資料庫事務必須具備acid特性,acid是atomic 原子性 consistency 一致性 isolation 隔離...