有沒有什麼辦法可以讓MySQL自動回滾第一個錯誤/警告的事務?MySQL:在事務失敗時自動回滾
現在,如果一切順利,它會提交,但是如果失敗,它會使事務處於打開狀態,並在另一次事務啓動時提交失敗事務中的未完成更改。所以我需要自動回滾這些失敗的交易..
(我正在執行查詢從PHP,但我不想檢查失敗的PHP,因爲它會使更多的電話之間的MySQL服務器和網絡服務器。)
謝謝
有沒有什麼辦法可以讓MySQL自動回滾第一個錯誤/警告的事務?MySQL:在事務失敗時自動回滾
現在,如果一切順利,它會提交,但是如果失敗,它會使事務處於打開狀態,並在另一次事務啓動時提交失敗事務中的未完成更改。所以我需要自動回滾這些失敗的交易..
(我正在執行查詢從PHP,但我不想檢查失敗的PHP,因爲它會使更多的電話之間的MySQL服務器和網絡服務器。)
謝謝
對不起,您將需要自己做這個。 我不是一個PHP人員,但在SQL中:如果您創建一個事務並在事務中執行多個MySQL操作,那麼如果回滾該事務,則所有事務都將回滾。注意:您需要使用事務性存儲引擎,並且必須將自動提交設置爲關閉。
如果您關心的是交易協調流量,那麼您可以創建一個存儲過程並簡單地調用它。
數據庫不會自動提交或回滾的原因是因爲它不知道你正在做什麼,提交一些數據並回滾其他數據可能在應用程序中是可以接受的。
我不知道這樣的功能,但我也看不出檢查失敗將意味着更多的呼叫:
try:
<my code>
except:
transaction.rollback()
raise
else:
transaction.commit()
- 這是在Python/Django的,但應直接向轉PHP - 無論是否存在問題(例外),它都需要完全相同數量的代碼來啓動新的事務。
第一次調用是事務,第二次是回滾,並將其乘以事務數量。我想發送一個包含更多事務的文件,我希望mysql執行所有事務並回滾任何失敗的事務。 – marianboda 2010-05-11 06:45:15
將自動提交設置爲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();
?>
我是否構成我的問題如此糟糕?我知道事務是如何工作的,我也只是詢問了有關mysql的解決方案,所以你是非PHP用戶。請告訴我哪個部分應該讓這個問題更清楚。 – marianboda 2010-05-10 21:38:40
@praksant如果我沒有用我寫的內容回答這個問題,那麼你在問什麼? – 2010-05-10 21:48:53
我問是否有辦法自動回滾,因爲它不是默認情況下的工作方式。我在我的問題中解釋了它的默認行爲。我想消除PHP中的檢查失敗,因爲這意味着每次事務需要1-2次調用。如果它自動回滾,我可以在一次通話中完成很多交易,這會提升性能。 – marianboda 2010-05-11 06:51:51