BEGIN;
UPDATE foo SET bar = 3;
UPDATE bar SET thing = 5;
COMMIT;
如果發生錯誤,則整個事務將被自動回滾。如果應用程序中的某些內容指示需要回滾,則只需執行ROLLBACK
即可。
有可能在MySQL中的過程或複合語句中顯式處理錯誤,但我不會推薦沿着這條路線走。請參閱how-to article和docs for DECLARE HANDLER。您還需要find the specific error code you want to handle,或者您可以使用一般的SQLEXCEPTION
條件。您還需要查看compound statements和defining stored programs。
無論如何,基於文檔,你可以做類似於下面的查詢,但它實際上不會做任何不同於我上面的回答。它也會讓你非常奇怪看起來使用MySQL的任何人(包括我自己)。
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
START TRANSACTION;
UPDATE foo SET bar = 3;
UPDATE bar SET thing = 5;
COMMIT;
END;
老答案:
如果你執行一個查詢,這是沒有意義的。只需執行查詢;如果發生錯誤,則不會發生任何事情 - 您的交易將自動回滾。
原因是,默認情況下,所有單個查詢都被封裝在一個名爲「autocommit」模式的「隱藏」事務中。典型的選擇是明確使用交易 - 一旦你執行「BEGIN」,你已經開始交易。一旦你COMMIT或ROLLBACK你會回到自動提交模式。
因此,在MySQL中使用事務的唯一原因是如果您希望在發生錯誤(或其他外部事件)時回滾到特定狀態。在MySQL中,如果發生錯誤,事務總是被中止。
最後,可以完全關閉此行爲,然後您必須始終顯式使用事務。我相信「BEGIN」隱含於您上次提交或回滾時,但您必須COMMIT或ROLLBACK您運行的任何查詢。請參閱The InnoDB Transaction Model以獲取更多信息。
儘管ROLLBACK還會回滾任何外部嵌套事務(至少在MSSQL中)。我認爲OP是在MSSQL中相當於@@ ERROR的MySQL檢測方法之後的,這可能只是一個Noddy示例 – Kristen 2009-02-16 09:08:20
我將解釋Assaf的說法:作爲MSSQL開發人員,將MySQL視爲具有SET XACT_ABORT默認開啓。直到最近我還不熟悉這個設置。看看這個網站: http://doc.ddart.net/mssql/sql70/set-set_40.htm – DJTripleThreat 2009-06-13 06:16:17
對於任何需要它的人來說,文檔已經移到這裏https://dev.mysql.com/doc/ refman/5.7/en/innodb-error-handling.html – 2017-07-07 15:04:48