2011-05-25 50 views
15

考慮以下幾點:自動回滾,如果COMMIT TRANSACTION沒有達到

START TRANSACTION; 

BEGIN; 

INSERT INTO prp_property1 (module_name,environment_name,NAME,VALUE) VALUES ('','production','','300000'); 

/** Assume there is syntax error SQL here...**/ 
Blah blah blah 

DELETE FROM prp_property1 WHERE environment_name = 'production'; 

COMMIT TRANSACTION; 

問:

我注意到,該交易將自動回滾和記錄插入嘗試失敗。

如果我沒有像上面那樣提供錯誤處理程序或錯誤檢查以及ROLLBACK TRANSACTION,它是否安全,因爲它似乎在像上面這樣的示例中執行此工作,因爲COMMIT TRANSACTION從未得到執行?

我假設事務立即回滾並在發生錯誤時立即丟棄。

+0

我正在使用SQLyog作爲客戶端。 – Koekiebox 2011-05-25 09:22:58

+0

請參閱http://stackoverflow.com/questions/6121917/automatic-rollback-if-commit-transaction-is-not-reached/32955274#32955274 – 2015-10-13 12:40:14

回答

21

不,事務一旦發生錯誤就不會回滾。但是您可能正在使用應用此策略的客戶端應用程序。

例如,如果您使用的是mysql命令行客戶端,那麼在發生錯誤時它通常會停止執行並將退出。在事務處理過程中退出會導致它被回滾。

當你編寫自己的應用程序,你可以控制在回退的政策,但也有一些例外:

  • 退出(即從數據庫斷開連接)總是在進步回滾事務
  • 死鎖或鎖定等待超時隱含地回滾比這些條件

其他,如果你調用產生錯誤的命令,則返回錯誤是正常的,你可以自由地做任何你喜歡的,其中包括合作無論如何都要收集交易。

+2

與文檔混淆:「回滾可能是一個緩慢的操作,可能發生隱含地沒有用戶明確地要求它(例如,當發生錯誤時)。「 :-S – zerkms 2011-05-25 09:13:33

+0

文檔不清楚;也許這意味着我在上面提到的情況? – MarkR 2011-05-25 12:30:36

+0

@zerkms ...可能發生...... – 2013-06-30 14:10:39

4

使用MySQL存儲過程

BEGIN 

    DECLARE exit handler for sqlexception 
     BEGIN 
     ROLLBACK; 
    END; 

    DECLARE exit handler for sqlwarning 
    BEGIN 
    ROLLBACK; 
    END; 

    START TRANSACTION; 

    INSERT INTO prp_property1 (module_name,environment_name,NAME,VALUE) VALUES ('','production','','300000'); 

    [ERROR] 

    COMMIT; 

    END 

如果警告或錯誤回滾,那麼你不需要刪除,與事務中的所有條目被刪除您可以設置。

4

我想補充@MarkR已經說過的話。錯誤處理,假設InnoDB引擎,如發生在Mysql Server Documentation

  • 如果你在一個表空間用完文件空間描述,一個MySQL表是發生完整的錯誤和InnoDB回滾的SQL語句。
  • 事務死鎖導致InnoDB回滾整個事務。
  • 重複鍵錯誤回滾SQL語句
  • 行太長錯誤回滾SQL語句。
  • 其他錯誤大多是由代碼的MySQL層(InnoDB存儲引擎級別以上)探測,它們回滾相應的SQL語句

我的理解也是當Mysql的會話結束(當PHP腳本結束時),任何未提交的內容都會回滾。我還沒有找到一個真正可靠的消息來源來支持這個聲明,所以不要拿我的話來說。

相關問題