十一 事務的特性 ACID

2021-08-20 08:31:54 字數 1585 閱讀 3252

多個執行緒開啟各自事務運算元據庫中資料時,資料庫系統要負責隔離操作,以保證各個執行緒在獲取資料時的準確性。

如果不考慮隔離性,可能會引發如下問題:

(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 隔離...