管理事務處理

摘要: 本篇博客僅做爲筆記,若有侵權,請聯繫,當即刪除(網上找博客學習,而後手記筆記,因紙質筆記不便保存,因此保存到網絡筆記)。數據庫

  本博介紹什麼是事務處理以及如何利用COMMIT和ROLLBACK語句來管理事務處理。安全

  1、事務處理網絡

注意:並不是全部引擎都支持事務處理  正如前面博客所說,並不是是全部引擎都支持明確的事務處理管理。MyISAM和InnoDB是兩種最常使用的引擎。前者不支持明確的事務處理管理,然後者支持。這就是爲何本系列博客中使用的樣例表被建立來使用InnoDB而不是更常用的MyISAM的緣由。若是你的應用中須要事務處理功能,則必定要使用正確的引擎類型。數據庫設計

  事務處理(transaction processing)能夠用來維護數據庫的完整性,它保證成批的MySQL操做要麼徹底執行,要麼徹底不執行。學習

  正如前面所述,關係數據庫設計把數據存儲在多個表中,使數據更容易操縱、維護和重用。不用深究如何以及爲何進行關係數據庫設計,在某種程度上說,設計良好的數據庫模式都是關聯的。spa

  給系統添加訂單的過程以下。設計

  (1)檢查數據庫中是否存在相應的客戶(從customers表查詢),若是不存在,添加他/她。code

  (2)檢索客戶的ID。blog

  (3)添加一行到orders表,把它與客戶ID關聯。事務

  (4)檢索orders表中賦予的新訂單ID。

  (5)對於訂購的每一個物品在orderitems表中添加一行,經過檢索出來的ID把它與orders表關聯(以及經過產品ID與products表關聯)。

  如今,假如因爲某種數據庫故障(如超出磁盤空間、安全限制、表鎖等)阻止了這個過程的完成。數據庫中的數據會出現什麼狀況?

  若是故障發生在添加了客戶以後,orders表添加以前,不會有什麼問題。某些客戶沒有訂單是徹底合法的。在從新執行此過程時,所插入的客戶記錄將被檢索和使用。能夠有效地從出故障的地方開始執行此過程。

  可是,若是故障發生在orders行添加以後,orderitems行添加以前,怎麼辦?如今,數據庫中有一個空訂單。

  更糟的是,若是系統在添加orderitems行之中出現故障。結果是數據庫中存在不完整的訂單,並且你還不知道。

  如何解決這種問題?這裏就須要使用事務處理了。事務處理是一種機制,用來管理必須成批執行的MySQL操做,以保證數據庫不包含不完整的操做結果。利用事務處理,能夠保證一組操做不會中途中止,它們或者做爲總體執行,或者徹底不執行(除非明確指示)。若是沒有錯誤發生,整租語句提交給(寫到)數據庫表。若是發生錯誤,則進行回退(撤銷)以恢復數據庫到某個已知且安全的狀態。

  所以,請看相同的例子,此次咱們說明過程如何工做。

  (1)檢查數據庫中是否存在相應的客戶,若是不存在,添加他/她。

  (2)提交客戶信息。

  (3)檢索客戶的ID。

  (4)添加一行到orders表。

  (5)若是在添加行到orders表時出現故障,回退。

  (6)檢索orders表中賦予的新訂單ID。

  (7)對於訂購的每項物品,添加新行到orderitems表。

  (8)若是在添加新行到orderitems時出現故障,回退全部添加的orderitems行和orders行。

  (9)提交訂單信息。

  在使用事務和事務處理時,有幾個關鍵詞反覆出現。下面關於事務處理須要知道的幾個術語:

  (1)事務(transaction)指一組SQL語句;

  (2)回退(rollback)指撤銷指定SQL語句的過程;

  (3)提交(commit)指將未存儲的SQL語句結果寫入數據庫表;

  (4)保留點(savepoint)指事務處理中設置的臨時佔位符(place-holder),你能夠對它發佈回退(與回退整個事務處理不一樣)。

  2、控制事務處理

   既然咱們已經知道了什麼是事務處理,下面討論事務處理的管理中所涉及的問題。

  管理事務處理的關鍵在於將SQL語句租分解爲邏輯塊,並明確規定數據什麼時候應該回退,什麼時候不該該回退。

  MySQL使用下面的語句來標識事務的開始:

START TRANSACTION

  一、使用ROLLBACK

  MySQL的ROLLBACK命令用來回退(撤銷)MySQL語句,請看下面的語句:

SELECT * FROM ordertotals;
START TRANSACTION
DELETE FROM ordertotals;
SELECT * FROM ordertotals;
ROLLBACK;
SELECT * FROM ordertottals;

  分析:這個例子從顯示ordertotals表的內容開始。首先執行一條SELECT以顯示該表不爲空。而後開始一個事務處理,用一條DELETE語句刪除ordertotals中的全部行。另外一條SELECT語句驗證ordertotals確實爲空。這時用一條ROLLBACK語句回退START TRANSACTION以後的全部語句,最後一條SELECT語句顯示該表不爲空。

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

注意:哪些語句能夠回退?  事務處理用來管理INSERT、UPDATE和DELETE語句。你不能回退SELECT語句。(這樣作也沒有什麼意義。)你不能繪圖CREATE或DROP操做。事務處理塊中可使用這兩條語句,但你執行回退,它們不會被撤銷。

  二、使用COMMIT

  通常的MySQL語句都是直接針對數據庫表執行和編寫的。這就是所謂的隱含提交,即提交(寫或保存)操做是自動進行的。

  可是,在事務處理塊中,提交不會隱含地進行。爲進行明確的提交,使用COMMIT語句,以下所示:

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語句執行後,事務會自動關閉(未來的更改會隱含提交)。

  三、使用保留點

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

  例如,前面描述的添加訂單的過程爲一個事務處理。若是發生錯誤,只須要返回到添加orders行以前便可,不須要回退到customers表(若是存在的話)。

  爲了支持回退部分事務處理,必須能在事務處理塊中合適的位置放置佔位符。這樣,若是須要回退,能夠回退到某個佔位符。

  這些佔位符稱爲保留點。爲了建立佔位符,可以下使用SAVEPOINT語句:

SAVEPOINT delete1;

  每一個保留點都取標識它的惟一名字,以便在回退時,MySQL知道要回退到何處。爲了回退到本例給出的保留點,可以下進行:

ROLLBACK TO delete1;

注意:保留點越多越好  能夠在MySQL代碼中設置任意多的保留點,越多越好。爲何呢?由於保留點越多,你就越能按本身的意願靈活地進行回退。

      釋放保留點  保留點在事務處理完成(執行一條ROLLBACK或COMMIT)後自動釋放。MySQL 5以來,也能夠用RELEASE SAVEPOINT明確地釋放保留點。

  四、更改默認的提交行爲

  正如所述,默認的MySQL行爲是自動提交全部更改。換句話說,任什麼時候候你執行一條MySQL語句,該語句實際上都是針對表執行的,並且所作的更改當即生效。爲指示MySQL不自動提交更改,須要使用如下語句:

SET autocommit=0;

  autocommit標誌決定是否自動提交更改,無論有沒有COMMIT語句。設置aurocommit爲0(假)指示MySQL不自動提交更改(直到autocommit被設置爲真爲止)。

  3、小結

  本博介紹了事務處理是必須完整執行的SQL語句塊。咱們學習瞭如何使用COMMIT和ROLLBACK語句對什麼時候寫數據,什麼時候撤銷進行明確的管理。還學習瞭如何使用保留點對回退操做提供更強大的控制。

相關文章
相關標籤/搜索