以銀行轉帳為例:李彥宏轉 1000 元給周鴻祎。若扣款成功但入帳失敗,資料將不一致。傳統無事務寫法:
UPDATE account SET cash = cash - 1000 WHERE id = 1;
UPDATE account SET cash = cash + 1000 WHERE id = 2;
此時必須引入事務機制,確保操作原子性。
| 特性 | 說明 |
|---|---|
| 原子性 | 一組 SQL 要麼全執行,要麼全不執行 |
| 隔離性 | 事務執行過程對其他事務不可見 |
| 持久性 | 提交後不可撤銷,資料永久生效 |
| 一致性 | 事務前後資料總額不變(如轉帳總金額守恆) |
START TRANSACTION;
UPDATE account SET cash = cash - 1000 WHERE id = 1;
UPDATE account SET cash = cash + 1000 WHERE id = 2;
COMMIT; -- 若出錯可 ROLLBACK
適用場景:對資料一致性要求高的業務(轉帳、下單扣庫存等)。
儲存引擎決定資料的存儲、索引、鎖定等底層行為。MySQL 以插件式架構支援多種引擎,最需掌握兩大主流:
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事務支援 | ❌ 不支援 | ✅ 支援 ACID |
| 鎖粒度 | 表級鎖 | 行級鎖 |
| 全文索引 | 早期支援 | 5.6+ 支援 |
| 外鍵約束 | ❌ | ✅ |
| 崩潰恢復 | 較弱 | Redo Log 保證 |
| 適用場景 | 讀多寫少、全文搜尋 | 高併發寫入、事務業務 |
CREATE TABLE t (...) ENGINE=MyISAM DEFAULT CHARSET=utf8;
選型建議:核心業務優先 InnoDB;唯讀分析、日誌類可考慮 MyISAM 或 ColumnStore。