[MYSQL -26]控制事務處理

VictorLeeLk發表於2017-09-21

1、事務處理

支援事務處理的引擎為InnoDB,不支援的為MyISAM.
事務處理作用:可以用來維護資料庫的完整性,它保證成批的MYSQL操作要麼完全執行,要麼完全不執行。

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

術語

事務(transaction): 指一組SQL語句;
回退(rollback):指撤銷指定SQL語句的過程;
提交(commit):指將未儲存的SQL語句結果寫入到資料庫表;
保留點(savepoint):指事務處理中設定的臨時佔位符,你可以對它釋出回退(與回退整個事務處理不同)

2、控制事務處理

關鍵:在於將SQL語句分解為邏輯塊,並明確規定資料何時應該回退,何時不應該回退。

2.1使用ROLLBACK

MYSQL的ROLLBACK命令用來回退(撤銷)MYSQL語句。

SELECT * FROM ordertotal;

START TRANSACTION;
DELETE FROM ordertotal;
SELECT * FROM ordertotal;
ROLLBACK;
SELECT * FROM ordertotal;

這個例項顯示ordertotals表的內容開始。

  • 首先執行一條SELECT以顯示該表不為空。
  • 然後開始一個事務處理,用一條DELETE語句刪除ordertotals中的所有行。
  • 另一條SELECT語句驗證ordertotals確實為空。
  • 這時用一條ROLLBACK語句回退SATRT TRANSACTION之後的所有語句。
  • 最後一條SELECT語句顯示該表不為空。

顯然,ROLLBACK只能在一個事務處理中使用(在執行一條START TRANSACTION命令之後)

退

\color{red}{哪些語句可以回退?}

事務處理用來管理INSERT、UPDATE和DELETE語句。你不能回退SELECT語句。你不能回退CREAT和DROP操作。事務處理塊中可以使用者兩條語句,但是你執行回退,它們不會被撤銷。


2.2使用COMMIT

一般MYSQL語句都是直接針對資料表執行和編寫的。這就是所謂的隱含提交,即提交(寫或儲存)操作是自動進行的。
但是,在事務處理塊中,提交不會隱含地進行。為進行明確的提交,使用COMMIT語句,如下所示:

START TRANSACTION;
DELIMITER //
DELETE FROM orderitems WHERE order_num=20010;
DELETE FROM orders WHERE order_num=20010;
COMMIT //
DELIMITER ;

最後的COMMIT語句僅僅在不出錯時候寫出更改。如果第一條DELETE起作用,但第二條失敗,則DELETE不會更改(實際上,它是被自動撤銷的)

  • 隱含事務關閉:當COMMIT或者ROLLBACK語句執行後,事務自動關閉(將來的更改會隱含提交)

2.3使用保留點

簡單的ROLLBACK和COMMIT語句就可以寫入或撤銷整個事務處理。但是,只是對簡單的事務處理才能這樣做,更復雜的事務處理可能需要部分提交或回退。

為了支援部分事務處理,必須能在事務處理塊中合適的位置放置佔位符。這樣如果回退,可以回退到某個佔位符。這些站位符稱為保留點。為了建立佔位符,可以使用SAVEPOINT語句。

SAVEPOINT delete1;#保留點設定

ROLLBACK TO delete1;#回退到給出的保留點

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

  • 保留點越多越好
    可以在MYSQL程式碼中設定任意多的保留點,保留點越多越好。因為越多,就越能按照自己的意願靈活的進行回退。
  • 釋放保留點
    保留點在事務處理中完成(執行一條ROLLBACK或COMMIT)後自動釋放。自MYSQL5以來,也可以用RELEASE SAVEPOINT明確地釋放保留點。

2.4更改預設的提交行為

預設的提交行為識自動提交所有更改。執行一條SQL語句,實際針對表執行,而且所做的更改立刻生效。為指示MYSQL不自動提交更改,需使用以下語句:

SET autocommit=0;
  • autocommit標誌決定是否自動提交更改,不管有沒有COMMIT語句。
    設定為0時指示MYSQL不自動提交更改(直到autocommit被設定為真為止)。

  • autocommit針對每個連線,而不是伺服器的。

相關文章