mysql事務

pine1203發表於2024-05-10

1. 事務

  事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要麼同時成功,要麼同時失敗。


2. 控制事務


  • 控制事務一
  1. 檢視/設定事務提交方式
SELECT @@autocommit ;

SET @@autocommit = 0 ;
  1. 提交事務
COMMIT;
  1. 回滾事務
ROLLBACK;

注意:

上述的這種方式,我們是修改了事務的自動提交行為, 把預設的自動提交修改為了手動提交, 此時我們執行的DML語句都不會提交, 需要手動的執行commit進行提交。


  • 控制事務二
  1. 開啟事務
START TRANSACTION 或 BEGIN ;
  1. 提交事務
COMMIT;
  1. 回滾事務
ROLLBACK;


案例:

-- 開啟事務
start transaction

-- 1. 查詢張三餘額
select * from account where name = '張三';

-- 2. 張三的餘額減少1000
update account set money = money - 1000 where name = '張三';

-- 3. 李四的餘額增加1000
update account set money = money + 1000 where name = '李四';

-- 如果正常執行完畢, 則提交事務
commit;

-- 如果執行過程中報錯, 則回滾事務
rollback;


3. 事務四大特性

  • 原子性(Atomicity):事務是不可分割的最小操作單元,要麼全部成功,要麼全部失敗。

  • 一致性(Consistency):事務完成時,必須使所有的資料都保持一致狀態。

  • 隔離性(Isolation):資料庫系統提供的隔離機制,保證事務在不受外部併發操作影響的獨立環境下執行。

  • 永續性(Durability):事務一旦提交或回滾,它對資料庫中的資料的改變就是永久的。

上述就是事務的四大特性,簡稱ACID。


4. 併發事務問題

  • 贓讀:一個事務讀到另外一個事務還沒有提交的資料。

  • 不可重複讀:一個事務先後讀取同一條記錄,但兩次讀取的資料不同,稱之為不可重複讀。
      

  • 幻讀:一個事務按照條件查詢資料時,沒有對應的資料行,但是在插入資料時,又發現這行資料已經存在,好像出現了 "幻影"。
      


5. 事務隔離級別

為了解決併發事務所引發的問題,在資料庫中引入了事務隔離級別。主要有以下幾種:

  • 檢視事務隔離級別
SELECT @@TRANSACTION_ISOLATION;
  • 設定事務隔離級別
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

注意:事務隔離級別越高,資料越安全,但是效能越低。