1. 程式人生 > >資料庫事務的四大特性:ACID

資料庫事務的四大特性:ACID

事務的4大特性(ACID):

原子性(Atomicity)

事務是資料庫的邏輯工作單位,它對資料庫的修改要麼全部執行,要麼全部不執行。

一致性(Consistemcy)

事務前後,資料庫的狀態都滿足所有的完整性約束。

隔離性(Isolation)

併發執行的事務是隔離的,一個不影響一個。如果有兩個事務,執行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化或序列化請求,使得在同一時間僅有一個請求用於同一資料。通過設定資料庫的隔離級別,可以達到不同的隔離效果。

永續性(Durability)

在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。

併發事務引起的問題:

更新丟失

兩個事務都同時更新一行資料,但是第二個事務卻中途失敗退出,導致對資料的兩個修改都失效了。這是因為系統沒有執行任何的鎖操作,因此併發事務並沒有被隔離開來。

髒讀

髒讀又稱無效資料讀出。一個事務讀取另外一個事務還沒有提交的資料叫髒讀。

例如:事務T1修改了一行資料,但是還沒有提交,這時候事務T2讀取了被事務T1修改後的資料,之後事務T1因為某種原因Rollback了,那麼事務T2讀取的資料就是髒的。

不可重複讀

不可重複讀是指在同一個事務內,兩個相同的查詢返回了不同的結果。

例如:事務T1讀取某一資料,事務T2讀取並修改了該資料,T1為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。

幻讀

事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的資料或者缺少了第一次查詢中出現的資料

例如:系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣。這就叫幻讀。

事務的隔離級別:

以上的4種問題(更新丟失、髒讀、不可重複讀、幻讀)都和事務的隔離級別有關。通過設定事務的隔離級別,可以避免上述問題的發生。

未授權讀取級別:

也稱為讀未提交(Read Uncommitted)。

以操作同一行資料為前提,讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他寫事務(但允許其他讀事務)。

此隔離級別可以防止更新丟失,但不能防止髒讀、不可重複讀、幻讀

此隔離級別可以通過“排他寫鎖”實現。

授權讀取級別:

也稱為讀提交(Read Committed)。

以操作同一行資料為前提,讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他讀事務和寫事務。

此隔離級別可以防止更新丟失、髒讀,但不能防止不可重複讀、幻讀

此隔離級別可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。

可重複讀取級別:

可重複讀取(Repeatable Read)。

以操作同一行資料為前提,讀事務禁止其他寫事務(但允許其他讀事務),未提交的寫事務禁止其他讀事務和寫事務。

此隔離級別可以防止更新丟失、髒讀、不可重複讀,但不能防止幻讀

此隔離級別可以通過“共享讀鎖”和“排他寫鎖”實現。

序列化級別:

序列化(Serializable)。

提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,不能併發執行。

此隔離級別可以防止更新丟失、髒讀、不可重複讀、幻讀

如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。

隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為Read Committed。它能夠避免更新丟失、髒讀,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。