【MySQL必知必會(二十二)】【管理事務處理】

2020-10-08 11:00:24

上一篇:【MySQL必知必會(二十一)】【使用觸發器】

+++++++++++++開始線++++++++++++++++

一、 事務處理

並非所有引擎都支援事務處理

MyISAM和InnoDB是兩種最常使用的引擎。前者不支援明確的事務處理管理,而後者支援。

事務處理(transaction processing)可以用來維護資料庫的完整性,它保證成批的MySQL操作要麼完全執行,要麼完全不執行。

事務處理是一種機制,用來管理必須成批執行的MySQL操作,以保證資料庫不包含不完整的操作結果。利用事務處理,可以保證一組操作不會中途停止,它們或者作為整體執行,或者完全不執行。如果沒有錯誤發生,整組語句提交給資料庫表。如果發生錯誤,則進行回退以恢復資料庫到某個已知且安全的狀態。

事務(transaction)指一組SQL語句
回退(rollback)指復原指定SQL語句的過程
提交(commit)指將為儲存的SQL語句結果寫入資料庫表
保留點(savepoint)指事務處理中設定的臨時預留位置,你可以對它釋出回退

二、 控制事務處理

管理事務處理的關鍵就是在與將SQL語句組分解為邏輯塊,並明確規定資料何時應該回退,何時不應該回退。

標識事務的開始

START TRANSACTION

2.1 使用ROLLBACK

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語句顯示該表不為空。

2.2 使用COMMIT

一般的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語句執行後,事務會自動關閉

2.3 使用保留點

為了支援回退部分事務處理,必須能在事務處理塊中合適的位置放置預留位置。這樣如果回退,可以回退到某個預留位置。

建立預留位置

SAVEPOINT delete1;

每個保留點都取標識它的唯一名字,以便在回退時,MySQL知道回退到何處。回退到保留點

ROLLBACK TO delete1;

保留點越多越好

保留點越多,可以靈活地進行回退

釋放保留點

保留點在事務處理完成後自動釋放

2.4 更改預設的提交行為

預設的MySQL行為是自動提交所有更改。任何時候你執行一條MySQL語句,該語句實際上都是針對表執行的,而且所作的更改立即生效。

mysql> SET autocommit=0;

分析

autocommit標誌決定是否自動提交更改,為假則不自動

標誌為連線專用

autocommit標誌是針對每個連線而不是伺服器的。

+++++++++++++結束線++++++++++++++++

下一篇:【MySQL必知必會(二十三)】【全球化和在地化】