一組操作要么全成功,要么全失敗,視為單一工作單元。
| 特性 | 英文 | 含義 |
|---|---|---|
| 原子性 | Atomicity | 全部執行或全部回滾,無中間態 |
| 一致性 | Consistency | 事務前後數據庫從一個一致狀態轉到另一個 |
| 隔離性 | Isolation | 並發事務互不干擾,四級隔離級別控制可見度 |
| 持久性 | Durability | 提交後修改永久保存,掉電不丟失 |
-- 開啟事務 START TRANSACTION; -- 或 BEGIN WORK -- 業務 SQL INSERT ...; UPDATE ...; DELETE ...; -- 成功提交 COMMIT; -- 失敗回滾 ROLLBACK;
autocommit=ON:每條 SQL 隱式事務自動提交SET autocommit = 0; 後續語句歸屬同一事務,需顯式 COMMITSHOW VARIABLES LIKE 'autocommit';僅支持事務的表類型(MyISAM 不支持)。建表指定:
CREATE TABLE tcount_tbl (
tutorial_author VARCHAR(40) NOT NULL,
tutorial_count INT
) ENGINE=InnoDB;
<?php
$mysqli = new mysqli('localhost', 'root', 'rootpassword', 'TUTORIALS', 3306);
if ($mysqli->connect_errno) { die('連接失敗: ' . $mysqli->connect_error); }
try {
$mysqli->begin_transaction(); // 關閉自動提交並開始事務
$mysqli->query("INSERT INTO accounts (user, amount) VALUES ('A', -100)");
$mysqli->query("INSERT INTO accounts (user, amount) VALUES ('B', 100)");
// 模擬業務邏輯檢查
if (false) { throw new Exception('業務校驗失敗'); }
$mysqli->commit();
echo "轉賬成功";
} catch (Exception $e) {
$mysqli->rollback();
echo "轉賬失敗,已回滾: " . $e->getMessage();
}
$mysqli->close();
?>
| 級別 | 髒讀 | 不可重複讀 | 幻讀 | 鎖開銷 |
|---|---|---|---|---|
| READ UNCOMMITTED | ✓ | ✓ | ✓ | 最低 |
| READ COMMITTED | ✗ | ✓ | ✓ | 低 |
| REPEATABLE READ | ✗ | ✗ | ✓ (InnoDB 間隙鎖解決) | 中 |
| SERIALIZABLE | ✗ | ✗ | ✗ | 最高 |
設置:SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;