MySQL基礎之管理事務
事務處理
並非所有的引擎都支援事務處理
MyISAM和InnoDB是兩種最常用使用的引擎。前者不支援明確的事務處理管理, 而後者支援。
事務處理(transaction processing)可以用來維護資料庫的完整性, 它保證成批的MySQL操作要麼完全執行, 要麼完全不執行
事務處理是一種機制, 用來管理必須成批執行的MySQL操作, 以保證資料庫不包含不完全的操作結果。利用事務處理, 可以保證一組資料不會中途停止, 它們或者作為整體執行, 或者完全不執行(除非明確指示)。如果沒有錯誤發生, 整組語句提交給(寫入)資料庫表。如果發生錯誤, 則進行回退(撤銷)以恢復資料庫到某個已知且安全的狀態。
- 事務(transaction)指一組SQL語句
- 回退(rollback)指撤銷指定SQL語句的過程
- 提交(commit)指將未儲存的SQL語句結果寫入到資料庫表
- 保留點(savepoint)指事務處理中設定的臨時佔位符(place-holder), 可以對他釋出回退(與回退整個事務處理不同)
控制事務處理
管理事務處理的關鍵在於將SQL語句組分解為邏輯塊, 並明確規定資料何時應該回退, 何時不應該回退。
MySQL使用下面的語句來標識事務的開始
MariaDB [crashcourse]> START TRANSACTION
使用ROLLBACK
MySQL的ROLLBACK命令用於回退(撤銷)MySQL語句
MariaDB [crashcourse]> SELECT * FROM ordertotals; START TRANSACTION; DELETE FROM ordertotals; SELECT * FROM ordertotals; ROLLBACK;SELECT * FROM ordertotals;
ROLLBACK只能在一個事務處理內使用(在執行一條START TRANSACTION命令之後)
事務處理用來管理INSERT、UPDATE和DELETE語句。不能回退SELECT語句
使用COMMIT
一般的MySQL語句都是直接針對資料庫表執行和編寫的。這就是所謂的隱含提交(implicit commit), 即提交(寫或儲存)操作是自動進行的
但是, 在事務處理塊中, 提交不會隱含地進行。為了進行明確的提交, 使用COMMIT語句, 如下所示:
MariaDB [crashcourse]> START TRANSACTION; DELETE FROM orderitems WHERE order_num = 20010; DELETE FROM orderitems WHERE order_num = 20010; COMMIT;
當COMMIT或ROLLBACK語句執行後, 事務會自動關閉(將來的更改會隱含提交)
使用保留點
簡單的ROLLBACK和COMMIT語句就可以寫入或撤銷整個事務處理。但是, 只是對簡單的事務處理才這樣做, 更復雜的事務處理可能需要部分提交或回退。
為了支援回退和部分事務處理, 必須能在事務處理塊中合適的位置放置佔位符。這樣, 如果需要回退, 可以回退到某個佔位符。
這些佔位符稱為保留點。為了建立佔位符, 可如下使用SAVEPOINT語句
MariaDB [crashcourse]> SAVEPOINT delete1;
每個保留點都取標識他的唯一名字, 以便在回退時, MySQL知道要回退到何處。 為了回退到本例給出的保留點, 可如下進行:
MariaDB [crashcourse]> ROLLBACK TO delete1;
保留點在事務處理完成後自動釋放。也可以使用RELEASE SAVEPOINT明確地釋放保留點
更改預設的提交行為
預設的MySQL行為是自動提交所有更改。換句話說, 任何時候執行一條MySQL語句, 該語句實際都是針對表執行的, 而且所做的更改立即生效。為指示MySQL不自動提交更改, 需要使用如下語句
MariaDB [crashcourse]> SET autocommit = 0;
autocommit標誌決定是否自動提交更改, 不管有沒有COMMIT語句。設定autocommit為0(假)指示MySQL不自動提交更改(直到autocommit被設定為真為止)