+++++++++++++開始線++++++++++++++++
並非所有引擎都支援事務處理
MyISAM和InnoDB是兩種最常使用的引擎。前者不支援明確的事務處理管理,而後者支援。
事務處理(transaction processing)可以用來維護資料庫的完整性,它保證成批的MySQL操作要麼完全執行,要麼完全不執行。
事務處理是一種機制,用來管理必須成批執行的MySQL操作,以保證資料庫不包含不完整的操作結果。利用事務處理,可以保證一組操作不會中途停止,它們或者作為整體執行,或者完全不執行。如果沒有錯誤發生,整組語句提交給資料庫表。如果發生錯誤,則進行回退以恢復資料庫到某個已知且安全的狀態。
事務(transaction)指一組SQL語句
回退(rollback)指復原指定SQL語句的過程
提交(commit)指將為儲存的SQL語句結果寫入資料庫表
保留點(savepoint)指事務處理中設定的臨時預留位置,你可以對它釋出回退
管理事務處理的關鍵就是在與將SQL語句組分解為邏輯塊,並明確規定資料何時應該回退,何時不應該回退。
標識事務的開始
START TRANSACTION
ROLLBACK命令用來回退MySQL語句
mysql> SELECT * FROM ordertotals;
-> START TRANSACTION;
-> DELETE FROM ordertotals;
-> SELECT * FROM ordertotals;
-> ROLLBACK;
-> SELECT * FROM ordertotals;
-> //
分析
首先執行一條SELECT以顯示該表不為空。然後開始一個事務處理,用一條DELETE語句刪除ordertotals中的所有行。另一條SELECT語句驗證ordertotals確實為空。這時用一條ROLLBACK語句回退START
TRANSACTION之後的所有語句,最後一條SELECT語句顯示該表不為空。
一般的MySQL語句都是直接針對資料庫表執行和編寫的。這就是隱含提交,即提交操作是自動進行的。
在事務處理時,提交不會隱含地進行。為進行明確的提交,使用COMMIT語句
mysql> 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語句執行後,事務會自動關閉
為了支援回退部分事務處理,必須能在事務處理塊中合適的位置放置預留位置。這樣如果回退,可以回退到某個預留位置。
建立預留位置
SAVEPOINT delete1;
每個保留點都取標識它的唯一名字,以便在回退時,MySQL知道回退到何處。回退到保留點
ROLLBACK TO delete1;
保留點越多越好
保留點越多,可以靈活地進行回退
釋放保留點
保留點在事務處理完成後自動釋放
預設的MySQL行為是自動提交所有更改。任何時候你執行一條MySQL語句,該語句實際上都是針對表執行的,而且所作的更改立即生效。
mysql> SET autocommit=0;
分析
autocommit標誌決定是否自動提交更改,為假則不自動
標誌為連線專用
autocommit標誌是針對每個連線而不是伺服器的。
+++++++++++++結束線++++++++++++++++