MySQL 事務是指一組資料庫操作,在執行過程中要麼全部成功,要麼全部失敗。事務可以保證資料庫的原子性、一致性、隔離性和永續性(簡稱 ACID 特性),確保資料的正確性和一致性。
事務的四大特性(ACID)
原子性(Atomicity):
- 事務中的所有操作要麼全部成功,要麼全部失敗。即使系統發生崩潰,事務中的操作也不會部分提交。
- 例如,銀行轉賬操作,如果轉賬過程中涉及多個操作(如從賬戶A扣錢、往賬戶B存錢),要麼兩個操作都成功,要麼兩個操作都失敗。
一致性(Consistency):
- 事務執行前後,資料庫都必須處於一致性狀態。事務開始之前,資料庫的狀態是合法的,執行完事務後,資料庫的狀態也是合法的。
- 例如,銀行賬戶的餘額在轉賬前後必須是合法的,不能出現負餘額等不合理的狀態。
隔離性(Isolation):
- 每個事務的執行不受其他事務的干擾,即使是併發執行的事務,彼此之間也不會相互影響。
- MySQL 提供了多種 隔離級別 來控制事務之間的相互影響,如 讀未提交、讀已提交、可重複讀、序列化。
永續性(Durability):
- 一旦事務提交,其對資料庫的修改就是永久性的,即使系統崩潰,已提交的事務修改也會被持久儲存。
- 例如,銀行轉賬成功後,即使系統當機,賬戶餘額的變動也不會丟失。
MySQL 事務的基本操作
開啟事務(START TRANSACTION 或 BEGIN)
開始一個新的事務。
START TRANSACTION; -- 或者 BEGIN;
提交事務(COMMIT)
提交事務,將所有操作儲存到資料庫。
COMMIT;
回滾事務(ROLLBACK)
回滾事務,撤銷自上次提交以來的所有操作。
ROLLBACK;
MySQL 事務的隔離級別
MySQL 提供了四種 事務隔離級別,它們影響事務之間的可見性和干擾程度:
READ UNCOMMITTED(讀未提交):
- 事務可以讀取未提交事務的資料(髒讀)。最低的隔離級別,可能導致資料不一致。
- 優點:提高併發性。
- 缺點:可能會發生髒讀、不可重複讀、幻讀。
READ COMMITTED(讀已提交):
- 事務只能讀取已提交事務的資料,避免了髒讀,但可能出現不可重複讀的現象。
- 優點:避免髒讀,資料較一致。
- 缺點:可能會出現不可重複讀和幻讀。
REPEATABLE READ(可重複讀):
- 事務在執行期間,讀取的資料會一直保持一致,避免了髒讀和不可重複讀。MySQL 預設的隔離級別。
- 優點:避免了髒讀和不可重複讀。
- 缺點:可能會發生幻讀。
SERIALIZABLE(序列化):
- 最高的隔離級別,事務將會以序列方式執行。事務之間完全隔離,避免了所有的併發問題,但效能較差。
- 優點:完全避免了髒讀、不可重複讀和幻讀。
- 缺點:效能差,事務執行的併發性降低。
MySQL 事務的鎖機制
為了實現事務的隔離性,MySQL 使用了多種 鎖機制,包括:
行鎖(Row Lock):
- 鎖定某一行資料,其他事務不能修改該行,適用於 InnoDB 儲存引擎。
表鎖(Table Lock):
- 鎖定整張表,其他事務無法對錶中的資料進行操作。表鎖會影響其他操作的併發性,但加鎖速度較快。
意向鎖(Intention Lock):
- 用於標識一個事務想要對某些行加鎖,避免不同事務間發生衝突。
死鎖(Deadlock):
- 當兩個事務互相等待對方持有的鎖時,發生死鎖,MySQL 會自動檢測死鎖並回滾其中一個事務。
事務的應用場景
銀行轉賬:
- 轉賬操作需要保證從一個賬戶扣款、向另一個賬戶存款的操作要麼全成功,要麼全失敗,避免資料不一致。
批次資料操作:
- 在處理多個插入、更新或刪除操作時,使用事務可以確保這些操作要麼全部成功,要麼全部回滾。
訂單支付系統:
- 訂單建立、庫存扣除、支付處理等操作需要在事務中執行,以保證訂單狀態的一致性。
總結
MySQL 事務是確保資料庫操作原子性、一致性、隔離性和永續性(ACID)的一種機制。透過事務,可以確保一組操作要麼全部成功,要麼全部回滾,從而保證資料的完整性和一致性。在實際應用中,合理設定事務隔離級別和鎖機制,可以最佳化資料庫的效能和併發能力。