原子性(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。它可以避免更新丟失、髒讀,並且具備較好的併發性能。儘管它會致使不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,能夠由應用程序採用悲觀鎖或樂觀鎖來控制。