1. 程式人生 > 實用技巧 >MySQL基礎之管理事務

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被設定為真為止)