2011-04-02 78 views
0

這裏是一個有趣的情況。MySQL記錄UPDATE應該失敗,但不會。爲什麼?

我用MySQL開始一個事務。我的交易涉及3個相關的查詢。 每個查詢都必須成功,如果不是,則不應將任何查詢寫入數據庫。

現在......第二個查詢......恰好是一個UPDATE查詢...我改變了 標識要更新爲無效(不存在)PK值的記錄的pk值。我希望第二個查詢失敗以進行測試。查詢很好,只是c_id的值是錯的(我試圖更新的記錄不會退出)。

的問題是,由於必須更新的一鍵記錄不是查詢與一個「OK」執行...

mysql> UPDATE tableX SET bal = 4576.99 WHERE c_id = 3789; 
Query OK, 0 rows affected (0.00 sec) 
Rows matched: 0 Changed: 0 Warnings: 0 

這是一個問題,因爲錯誤(錯誤是從我的角度在相關查詢鏈中更新)沒有被捕獲,因此事務沒有中止和回滾,而是進程繼續到第3個查詢,該查詢也成功並且事務被提交。

所以,我覺得奇怪的是,這樣的錯誤沒有被MySQL捕獲或沒有被MySQL標記爲錯誤。

任何有關爲什麼或如何解決的見解?

回答

4

這是正確的,0行已更新。 如果,你的邏輯,這是你應該測試受影響的行數,然後如果該數字爲0拋出一個錯誤的錯誤:

DECLARE count INT; 
    UPDATE tableX SET bal = 4576.99 WHERE c_id = 3789; 
    SELECT ROW_COUNT() INTO count; 
    IF count = 0 THEN 
    CALL raise_error; 
    END IF; 

錯誤會使事務回滾。 引發錯誤只是叫上這太問題闡述不存在常規: How to raise an error within a MySQL function

約ROW_COUNT進一步信息():

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count

相關問題