開始事務

事務是一組連續的 SQL 語句,例如 select,insert,update 或 delete,它們作為一個單獨的工作單元執行。

換句話說,除非組內的每個單獨操作都成功,否則事務永遠不會完成。如果事務中的任何操作失敗,則整個事務將失敗。

銀行事務將是解釋這一點的最好例子。考慮兩個帳戶之間的轉移。要實現此目的,你必須編寫執行以下操作的 SQL 語句

  1. 檢查第一個帳戶中請求金額的可用性
  2. 扣除第一個帳戶的金額
  3. 存入第二個帳戶

如果任何人這些過程失敗,整個應該恢復到以前的狀態。

ACID:事務的屬性

事務具有以下四個標準屬性

  • 原子性: 確保工作單元內的所有操作都成功完成; 否則,事務在失敗時中止,並且先前的操作回滾到其先前的狀態。
  • 一致性: 確保資料庫在成功提交的事務上正確更改狀態。
  • 隔離: 使事務能夠獨立執行並相互透明。
  • 永續性: 確保在系統出現故障時,已提交事務的結果或效果仍然存在。

事務以語句 START TRANSACTIONBEGIN WORK 開頭,以 COMMITROLLBACK 語句結束。開始和結束語句之間的 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 時,自動提交將保持禁用狀態,直到你使用 COMMITROLLBACK 結束事務。然後,自動提交模式將恢復為先前的狀態。

FOR UPDATE 指示(並鎖定)事務持續時間的行。

雖然事務仍未提交,但此事務將無法供其他使用者使用。

事務涉及的一般程式

  • 通過發出 SQL 命令 BEGIN WORKSTART TRANSACTION 開始事務。
  • 執行所有 SQL 語句。
  • 檢查是否所有內容都按照你的要求執行。
  • 如果是,則發出 COMMIT 命令,否則發出 ROLLBACK 命令將所有內容恢復到之前的狀態。
  • 如果你正在使用或最終可能使用 Galera / PXC,即使在 COMMIT 之後也要檢查錯誤。