參考:《MySQL必知必會》Ben Forta著,第26章 管理事務處理
事務處理
MyISAM和InnoDB是MySQL中兩種最常使用的引擎。前者不支持明確的事務處理管理,而後者支持。
事務處理(transaction processing)可以用來維護數據庫的完整性,它保證成批的MySQL操作要麼完全執行,要麼完全不執行。
- 事務(transaction)指一組SQL語句;
- 回退(rollback)指撤銷指定SQL語句的過程;
- 提交(commit)指將未存儲的SQL語句結果寫入數據庫表;
- 保留點(savepoint)指事務處理中設置的臨時佔位符(place-holder),你可以對它發佈回退(與回退整個事務處理不同)。
MySQL使用語句 "START TRANSACTION;" 來標識事務的開始。
使用ROLLBACK
ROLLBACK只能在一個事務處理內使用(在執行一條START TRANSACTION命令之後),ROLLBACK語句回退START TRANSACTION之後的所有語句。
事務處理用來管理INSERT、UPDATE和DELETE語句,不能回退CREATE或DROP操作。
mysql> SELECT * FROM ordertotals;
+-----------+---------+
| order_num | total |
+-----------+---------+
| 20005 | 158.86 |
| 20009 | 40.78 |
| 20006 | 58.30 |
| 20007 | 1060.00 |
| 20008 | 132.50 |
| 20008 | 132.50 |
+-----------+---------+
6 rows in set (0.01 sec)
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> DELETE FROM ordertotals;
Query OK, 6 rows affected (0.00 sec)
mysql> SELECT * FROM ordertotals;
Empty set (0.00 sec)
mysql> ROLLBACK;
Query OK, 0 rows affected (0.02 sec)
mysql> SELECT * FROM ordertotals;
+-----------+---------+
| order_num | total |
+-----------+---------+
| 20005 | 158.86 |
| 20009 | 40.78 |
| 20006 | 58.30 |
| 20007 | 1060.00 |
| 20008 | 132.50 |
| 20008 | 132.50 |
+-----------+---------+
6 rows in set (0.00 sec)
mysql>
使用COMMIT
一般的MySQL語句都是隱含提交(implicit commit),即提交(寫或保存)操作是自動進行的。
但是,在事務處理塊中,提交不會隱含地進行。爲進行明確的提交,使用COMMIT語句,如下所示:
START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;
說明:
從系統中完全刪除訂單20010。因爲涉及更新兩個數據庫表orders和orderitems,所以使用事務處理塊來保證訂單不被部分刪除。
COMMIT語句僅在不出錯時寫出更改。如果第一條DELETE起作用,但第二條失敗,則DELETE不會提交(會自動撤銷)。
注意:當COMMIT或ROLLBACK語句執行後,事務會自動關閉(將來的更改會隱含提交)。
使用保留點
簡單的ROLLBACK和COMMIT語句就可以寫入或撤銷整個事務處理。
但是,更復雜的事務處理可能需要部分提交或回退。
爲了支持回退部分事務處理,必須能在事務處理塊中合適的位置放置佔位符。這樣,如果需要回退,可以回退到某個佔位符。
這些佔位符稱爲保留點。爲了創建佔位符,可如下使用SAVEPOINT語句:
SAVEPOINT delete2;
爲了回退到上述保留點,使用如下語句:
ROLLBACK TO detele2;
說明:保留點在事務處理完成(執行一條ROLLBACK或COMMIT)後自動釋放。自MySQL 5以來,也可以用RELEASE SAVEPOINT明確地釋放保留點。