事務提供一種機制將一個活動涉及的所有操作納入到一個不可分割的執行單元,組成事務的所有操作只有在所有操作均能正常執行的情況下方能提交,只要其中任一操作執行失敗,都將導致整個事務的回滾。
簡單地說,事務提供一種“ 要么什么都不做,要么做全套(All or Nothing)”機制。
數據庫事務的 ACID 屬性
事務是基於數據進行操作,需要保證事務的數據通常存儲在數據庫中,所以介紹到事務,就不得不介紹數據庫事務的 ACID 特性。
ACID 指數據庫事務正確執行的四個基本特性的縮寫,包含:
原子性(Atomicity)
整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節。
事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
例如:銀行轉賬,從 A 賬戶轉 100 元至 B 賬戶,分為兩個步驟:
-
從 A 賬戶取 100 元。
-
存入 100 元至 B 賬戶。
這兩步要么一起完成,要么一起不完成,如果只完成第一步,第二步失敗,錢會莫名其妙少了 100 元。
一致性(Consistency)
在事務開始之前和事務結束以后,數據庫數據的一致性約束沒有被破壞。
例如:現有完整性約束 A+B=100,如果一個事務改變了 A,那么必須得改變 B,使得事務結束后依然滿足 A+B=100,否則事務失敗。
隔離性(Isolation)
數據庫允許多個並發事務同時對數據進行讀寫和修改的能力,如果一個事務要訪問的數據正在被另外一個事務修改,只要另外一個事務未提交,它所訪問的數據就不受未提交事務的影響。
隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。
例如:現有有個交易是從 A 賬戶轉 100 元至 B 賬戶,在這個交易事務還未完成的情況下,如果此時 B 查詢自己的賬戶,是看不到新增加的 100 元的。
持久性(Durability)
事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
簡單而言,ACID 是從不同維度描述事務的特性:
-
原子性:事務操作的整體性。
-
一致性:事務操作下數據的正確性。
-
隔離性:事務並發操作下數據的正確性。
-
持久性:事務對數據修改的可靠性。
MySql 的Undo 和 Redo日志詳情 :MySqlU Undo & Redo