數據庫事務:ACID 和隔離級別

一、什麼是事務

事務是將多條 SQL 作爲一個整體進行數據操作。這樣能確保全部執行成功或全部執行失敗,不改變任何數據。根據業務需求選擇不同的存儲引擎。對於那些不需要事務的查詢類應用,選擇非事務型的存儲引擎能得到更高的性能,LOCK TABLES 也能爲應用提供一定程度的保護。

二、怎樣使用

  • 開始事務:START TRANSACTION 或者 BEGIN

  • 提交事務持久保存已修改的數據:COMMIT

  • 回滾撤銷數據修改:ROLLBACK

三、應用場景

比較經典的應用就是轉賬操作,你要給 A 轉 100 塊,正常來說你的賬號會減少 100 塊,而 B 的賬號會增加 100 塊。但是轉賬過程中系統突然崩潰暴斃,導致你的賬號是減少了 100 塊,但 A 的賬號並沒有增加,這樣是不是就很離譜了。所以說我們需要將這兩個操作作爲一個整體來實現,要麼全部成功,要是有一個沒執行成功,那就全部失敗。

START TAANSACTION; 或者 BEGIN; -- 開始一個事務
UPDATE Gnahzi SET balance = balance - 100 WHERE id = 1;
UPDATE zhang SET balance = balance + 100 WHERE id = 2;
COMMIT; 或者 ROLLBACK; -- COMMIT 是提交事務把修改的數據持久保存;ROLLBACK 是回滾事務取消操作。

四、事務的 4 個特性:ACID

  • 原子性(Acomicity):一個事務是最小工作單元。不可能只執行其中一個操作,要麼全部執成功,要麼就全部失敗回滾。

  • 一致性(Consistency):一致性確保當 SQL 語句執行時系統崩潰,事務所做的修改不會保存到數據庫中,因爲事務最終沒有提交。

  • 隔離性(Isolation):通常來說,一個事務所做的修改在最終提交前,對其它事務是不可見的。

  • 持久性(Durability):一旦事務提交,所做的修改會永久保存到數據庫中。即使系統崩潰了,修改的數據也不會丟失。

五、事務的 4 個隔離級別:

  • 未提交讀(READ UNCOMMITTED):事務可以讀取未提交的數據,也稱作髒讀(Dirty Read)。一般很少使用。

  • 提交讀 | 不可重複讀(READ COMMITTED):是大都是 DBMS (如:Oracle、SQLServer)默認事務隔離。執行兩次同意的查詢卻有不同的結果,也叫不可重複讀。

  • 可重複讀(REPEABLE READ):是 MySQL 默認事務隔離級別。能確保同一事務多次讀取同一數據的結果是一致的。可以解決髒讀的問題,但理論上無法解決幻讀(Phantom Read)的問題。

  • 可串行化(SERIALIZABLE):是最高的隔離級別。強制事務串行執行,會在讀取的每一行數據上加鎖,這樣雖然能避免幻讀的問題,但也可能導致大量的超時和鎖爭用的問題。很少會應用到這種級別,只有在非常需要確保數據的一致性且可以接受沒有併發的應用場景下才會考慮。

Isolation Level 髒讀可能性(Dirty Read) 不可重複讀可能性(Non Repeatable Read) 幻讀可能性(Phantom Read)
Read Uncommitted Yes Yes Yes
Read Committed - Yes Yes
Repeatable Read - - Yes
Serializable - - -
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章