2010-05-10 434 views
1

有沒有什麼辦法可以讓MySQL自動回滾第一個錯誤/警告的事務?MySQL:在事務失敗時自動回滾

現在,如果一切順利,它會提交,但是如果失敗,它會使事務處於打開狀態,並在另一次事務啓動時提交失敗事務中的未完成更改。所以我需要自動回滾這些失敗的交易..

(我正在執行查詢從PHP,但我不想檢查失敗的PHP,因爲它會使更多的電話之間的MySQL服務器和網絡服務器。)

謝謝

回答

1

對不起,您將需要自己做這個。 我不是一個PHP人員,但在SQL中:如果您創建一個事務並在事務中執行多個MySQL操作,那麼如果回滾該事務,則所有事務都將回滾。注意:您需要使用事務性存儲引擎,並且必須將自動提交設置爲關閉。

如果您關心的是交易協調流量,那麼您可以創建一個存儲過程並簡單地調用它。

數據庫不會自動提交或回滾的原因是因爲它不知道你正在做什麼,提交一些數據並回滾其他數據可能在應用程序中是可以接受的。

+0

我是否構成我的問題如此糟糕?我知道事務是如何工作的,我也只是詢問了有關mysql的解決方案,所以你是非PHP用戶。請告訴我哪個部分應該讓這個問題更清楚。 – marianboda 2010-05-10 21:38:40

+0

@praksant如果我沒有用我寫的內容回答這個問題,那麼你在問什麼? – 2010-05-10 21:48:53

+0

我問是否有辦法自動回滾,因爲它不是默認情況下的工作方式。我在我的問題中解釋了它的默認行爲。我想消除PHP中的檢查失敗,因爲這意味着每次事務需要1-2次調用。如果它自動回滾,我可以在一次通話中完成很多交​​易,這會提升性能。 – marianboda 2010-05-11 06:51:51

1

我不知道這樣的功能,但我也看不出檢查失敗將意味着更多的呼叫:

try: 
    <my code> 
except: 
    transaction.rollback() 
    raise 
else: 
    transaction.commit() 

- 這是在Python/Django的,但應直接向轉PHP - 無論是否存在問題(例外),它都需要完全相同數量的代碼來啓動新的事務。

+0

第一次調用是事務,第二次是回滾,並將其乘以事務數量。我想發送一個包含更多事務的文件,我希望mysql執行所有事務並回滾任何失敗的事務。 – marianboda 2010-05-11 06:45:15

0

將自動提交設置爲false的關鍵點。

<?php 
$database= new mysqli("sever", "user", "key", "database"); 
$database->autocommit(FALSE); 
$error=0; 

//asumming we want to delete a users infomation from two table 
$database->query("delete from `pay` where `user`=1 ")?NULL:$error=1; 
$database->query("delete from `users` where `id`=1 ")?NULL:$error=1; 

if($error=0){ 
    $database->commit(); 
} else { 
    $database->rollback(); 
} 
$database->close(); 
?>