MySQL 事務核心只有三條指令,掌握即可實現「全做或全不做」的原子性操作。
| 指令 | 作用 | 關鍵點 |
|---|---|---|
START TRANSACTION; | 開啟事務,標記起始點 | 之後的 DML 納入事務 |
COMMIT; | 確認提交,永久生效 | 不可回滾,隱含結束事務 |
ROLLBACK; | 回滾到 START TRANSACTION 狀態 | 撤銷所有未提交變更 |
mysql> SELECT * FROM useraccount;
+-----------+--------+-------------+
| AccountID | userID | AccountName |
+-----------+--------+-------------+
| 1 | 2 | zhifubao |
+-----------+--------+-------------+
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE useraccount SET userID = 1;
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM useraccount;
+-----------+--------+-------------+
| AccountID | userID | AccountName |
+-----------+--------+-------------+
| 1 | 1 | zhifubao | -- 已修改,但未提交
+-----------+--------+-------------+
mysql> ROLLBACK;
Query OK, 0 rows affected (0.28 sec)
mysql> SELECT * FROM useraccount;
+-----------+--------+-------------+
| AccountID | userID | AccountName |
+-----------+--------+-------------+
| 1 | 2 | zhifubao | -- 回滾成功,恢復原值
+-----------+--------+-------------+
SAVEPOINT sp1; / ROLLBACK TO SAVEPOINT sp1; / RELEASE SAVEPOINT sp1; 實現部分回滾。SET autocommit=0; 關閉自動提交,所有 DML 需顯式 COMMIT;SET autocommit=1; 開啟 (預設)。SELECT ... FOR UPDATE 讀最新並加鎖。CREATE/DROP/ALTER) 會隱含提交,不可在事務中混用。ERROR 1213 重試。