一、事務的基本要素(acid)
1、原子性(atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,
不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,
所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,
就像化學中學過的原子,是物質構成的基本單位。
2、一致性(consistency):事務開始前和結束後,資料庫的完整性約束沒有被破壞 。
比如a向b轉賬,不可能a扣了錢,b卻沒收到。
3、隔離性(isolation):同一時間,只允許乙個事務請求同一資料,不同的事務之間
彼此沒有任何干擾。
比如a正在從一張銀行卡中取錢,在a取錢的過程結束前,b不能向這張卡轉賬。
4、永續性(durability):事務完成後,事務對資料庫的所有更新將被儲存到資料庫,不能回滾。
二、事務的併發問題
1、髒讀:事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料
2、不可重複讀:事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,
對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。
3、幻讀:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,
但是系統管理員b就在這個時候插入了一條具體分數的記錄,當系統管理員a改結束後
發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。
解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
隔離級別:
未提交讀(read uncommitted):在未提交讀級別,事務中的修改,即使沒有提交,
對其他事務也都是可見的。事務可以讀取未提交的資料,這也被稱為髒讀(dirty read)。
這個級別會導致很多問題,從效能上來說,未提交讀不會比其他的級別好太多,
但是缺乏其他級別的很多好處,在實際應用中一般很少使用。
提交讀(read committed)(不可重複讀):大多數資料庫系統的預設隔離級別都是提交讀
(但mysql不是)。提交讀滿足前面提到的隔離性的簡單定義:乙個事務開始時,只能「看見」
已經提交的事務所做的修改。換句話說,乙個事務從開始直到提交之前,所做的任何修改對
其他事務都是不可見的。這個級別有時候也叫做不可重複讀(nonrepeatable read),
因為 兩次執行同樣的查詢,可能會得到不一樣的結果。
可重複讀(repeatable read):可重複讀解決了髒讀的問題。該級別保證了在同乙個事務中
多次讀取同樣記錄的結果是一致的。但是理論上,可重複讀隔離級別還是無法解決另外乙個幻讀
(phantom read)問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另外乙個
事務中又在該範圍插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行(phantom row)。
可重複讀是mysql的預設事務隔離級別。
可序列化(serializable):可序列化是最高的隔離級別。它通過強制事務序列執行,
避免了前面所說的幻讀問題。簡單來說,可序列化會在讀取的每一行資料上都加上鎖,
所以可能導致大量的超時和鎖爭用問題。實際應用中也很少用到這個隔離級別,
只有在非常需要確保資料的一致性而且可以接受沒有併發的情況下,才考慮用該級別。
事務隔離級別
髒讀不可重複讀
幻讀讀未提交(read-uncommitted)是是
是不可重複讀(read-committed)否是
是可重複讀(repeatable-read)否否
是序列化(serializable)否否
否參考:
來自 <
來自 <>
資料庫事務特性和隔離級別
資料庫事務是資料庫管理系統執行過程中的乙個邏輯單位,有乙個有限的資料庫操作序列完成。以 a賬戶向b賬戶匯錢 為例,乙個事務是下面乙個操作序列 a.從a賬號中把餘額讀出來。b.對a賬號做減法操作。c.把結果寫回a賬號中。d.從b賬號中把餘額讀出來。e.對b賬號做加法操作。f.把結果寫回b賬號中。事務有...
資料庫事務特性和隔離級別
一組業務操作,要麼全部成功,要麼全部不成功。原子性 乙個事務是乙個整體,不可分割,事務中的操作要麼都成功,要麼都失敗。一致性 事務必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。事務執行前後,資料庫的狀態是一致的。例如 a有1000,元,b有1000元,加起來是2000,中間執行轉賬的操作,轉賬...
資料庫事務的特性和隔離級別
acid的事務特性 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 原子性就是要麼成功要麼失敗。一致性就是比如存款總額不變。從乙個一致性狀態轉移到另乙個一致性狀態。事務之間不可以相互影響。事務在提交之前是不被其他事務可見的。事務完...