MySQL 筆記9 事務處理

參考:《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明確地釋放保留點。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章