2009-10-27 83 views
9

在mysql innodb事務中,我期望重複鍵錯誤導致回滾。它不會,它只是拋出一個錯誤,並繼續到下一個命令。一旦COMMIT命令到達,事務將被提交,sans重複鍵導致命令。重複密鑰錯誤不取消/回滾mysql事務

這是預期的行爲?如果是這樣,那麼如何設置它,以便在出現這樣的錯誤時事務被回滾而不是提交?

測試環境:

CREATE TABLE `test` ( 
    `id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

BEGIN; 
    INSERT INTO test VALUES (5); 
    INSERT INTO test VALUES (5); 
COMMIT; 

預期的結果:表test是空

實際結果:表test包含價值5

+0

參見:http://dev.mysql.com/doc/refman/5.0/en/innodb-error-handling。 html – 2013-06-11 20:23:48

回答

3

如果發生錯誤,MySql(和其他sql引擎AFAIK)不會自動回滾事務。

您必須聲明的錯誤處理程序將回滾事務:

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 
BEGIN 
    ROLLBACK; 
    CALL ERROR_ROLLBACK_OCCURRED; 
END; 
8

一個記錄如果插入失敗,因爲副本中,數據庫將事務回滾到到該語句的開頭

它使用在語句開頭處製作的內部保存點,然後回滾到該保存點。

它不回滾整個交易,因爲這可能不是你想要的。

mysql客戶端的行爲可以使用命令行參數進行配置。它可以退出(這將隱式回滾)或繼續。

如果您使用自己的應用程序,它所做的是由您決定的。


Mysql不會對您如何處理失敗施加POLICY - 它會讓您的應用程序失效。所以你對他們做的是你自己的事情 - 如果你喜歡,你可以忽略它們。

+2

我想給你100個rep點,因爲「Mysql不會對你處理失敗施加POLICY - 它會讓你的應用程序失效,所以你對它們做的是你自己的業務 - 如果你喜歡,你可以忽略它們「。 – longneck 2009-10-27 18:16:35

+0

那麼有沒有辦法設置一個事務,以便自動回滾重複鍵錯誤?還是必須監視每個查詢的結果,然後顯式回滾以獲取此行爲? – allixsenos 2009-10-28 09:37:33