開始事務
事務是一組連續的 SQL 語句,例如 select,insert,update 或 delete,它們作為一個單獨的工作單元執行。
換句話說,除非組內的每個單獨操作都成功,否則事務永遠不會完成。如果事務中的任何操作失敗,則整個事務將失敗。
銀行事務將是解釋這一點的最好例子。考慮兩個帳戶之間的轉移。要實現此目的,你必須編寫執行以下操作的 SQL 語句
- 檢查第一個帳戶中請求金額的可用性
- 扣除第一個帳戶的金額
- 存入第二個帳戶
如果任何人這些過程失敗,整個應該恢復到以前的狀態。
ACID:事務的屬性
事務具有以下四個標準屬性
- 原子性: 確保工作單元內的所有操作都成功完成; 否則,事務在失敗時中止,並且先前的操作回滾到其先前的狀態。
- 一致性: 確保資料庫在成功提交的事務上正確更改狀態。
- 隔離: 使事務能夠獨立執行並相互透明。
- 永續性: 確保在系統出現故障時,已提交事務的結果或效果仍然存在。
事務以語句 START TRANSACTION
或 BEGIN WORK
開頭,以 COMMIT
或 ROLLBACK
語句結束。開始和結束語句之間的 SQL 命令構成了事務的大部分。
START TRANSACTION;
SET @transAmt = '500';
SELECT @availableAmt:=ledgerAmt FROM accTable WHERE customerId=1 FOR UPDATE;
UPDATE accTable SET ledgerAmt=ledgerAmt-@transAmt WHERE customerId=1;
UPDATE accTable SET ledgerAmt=ledgerAmt+@transAmt WHERE customerId=2;
COMMIT;
使用 START TRANSACTION
時,自動提交將保持禁用狀態,直到你使用 COMMIT
或 ROLLBACK
結束事務。然後,自動提交模式將恢復為先前的狀態。
FOR UPDATE
指示(並鎖定)事務持續時間的行。
雖然事務仍未提交,但此事務將無法供其他使用者使用。
事務涉及的一般程式
- 通過發出 SQL 命令
BEGIN WORK
或START TRANSACTION
開始事務。 - 執行所有 SQL 語句。
- 檢查是否所有內容都按照你的要求執行。
- 如果是,則發出
COMMIT
命令,否則發出ROLLBACK
命令將所有內容恢復到之前的狀態。 - 如果你正在使用或最終可能使用 Galera / PXC,即使在
COMMIT
之後也要檢查錯誤。