1. 程式人生 > >20 管理事務處理

20 管理事務處理

如何 col 放置 tar 個數 sta 編寫 pla 復數

20.1 事物處理

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

利用事務處理,可以保證一組操作不會中途停止,它們或者作為整體執行,或者完全不執行(除非明確指示)。如果沒有錯誤發生,整組語句提交給(寫到)數據庫表。如果發生錯誤,則進行回退(撤銷)以

恢復數據庫到某個已知且安全的狀態。

下面用一個例子來說明過程如何工作:

訂單存儲在orders和orderitems兩個表中: orders存儲實際的訂單,而orderitems存儲訂購的各項物品。這兩個表使用稱為主鍵(參閱第1章)的唯一ID互相關聯。這兩個表又與包含客戶和產品信息的其他表相關聯。

  1. 檢查數據庫中是否存在相應的客戶,如果不存在,添加它
  2. 提交客戶信息。
  3. 檢索客戶的ID
  4. 添加一行到orders表。
  5. 如果在添加行到orders表時出現故障,回退。
  6. 檢索orders表中賦予的新訂單ID
  7. 對於訂購的每項物品,添加新行到orderitems表。
  8. 如果在添加新行到orderitems時出現故障,回退所有添加的orderitems行和orders行。
  9. 提交訂單信息。

下面是關於事務處理需要知道的幾個術語:

  • 事務(transaction)指一組SQL語句;
  • 回退(rollback)指撤銷指定SQL語句的過程;
  • 提交(commit)指將未存儲的SQL語句結果寫入數據庫表;
  • 保留點(savepoint)指事務處理中設置的臨時占位符(place holder),你可以對它發布回退(與回退整個事務處理不同)。

20.2 控制事務處理

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

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

START TRANSACTION

20.2.1 使用ROLLBACK

MySQL的ROLLBACK命令用來回退(撤銷) 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語句顯示該表不為空。

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

註意:那些語句可以回退呢?

事務處理用來管理INSERT、 UPDATE和ELETE語句。不能回退SELECT語句。能回退CREATE或DROP操作。

20.2.2 使用COMMIT

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

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

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

在這個例子中,從系統中完全刪除訂單20010。因為涉及更新兩個數據庫表orders和orderItems,所以使用事務處理塊來保證訂單不被部分刪除。最後的COMMIT語句僅在不出錯時寫出更改。如果第一條

DELETE起作用,但第二條失敗,則DELETE不會提交。

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

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

這些占位符稱為保留點。為了創建占位符,可如下使用SAVEPOINT語句:

SAVEPOINT DELETE1;

為了回退到本該保留點,可如下進行:

ROLLBACK TO DELETE1;

20.2.3 更改默認的提交行為

默認的MySQL行為是自動提交所有更改。指示MySQL不自動提交更改,需要使用以下語句:

SET autocommit = 0;



20 管理事務處理