2012-12-22 89 views
2

我想在MySQL中使用事務,我的問題是如何檢查查詢是否成功提交?我的查詢是:檢查事務的狀態 - MySQL和PHP

mysql_query("START TRANSACTION"); 
$query_1 = mysql_query("DELETE FROM BLAH WHERE BLAH"); 
$query_2 = mysql_query("DELETE FROM BLAH WHERE BLAH"); 
mysql_query("COMMIT"); 

據我所知,上面的代碼做交易,但我要檢查,如果查詢成功或者未提交,因此:

mysql_query("START TRANSACTION"); 
    $query_1 = mysql_query("DELETE FROM BLAH WHERE BLAH"); 
    $query_2 = mysql_query("DELETE FROM BLAH WHERE BLAH"); 
    if($query_1 && $query_2){ 
     mysql_query(COMMIT); 
    }else{ 
     mysql_query(ROLLBACK); 
    } 

但我讀當我們調用「COMMIT」時,查詢會提交,所以上面的代碼不應該工作,因爲當我們檢查$query_1 && $query_2時,實際上什麼都沒有提交給db,因爲它在「COMMIT」查詢之前,我該如何執行這樣的檢查?

在此先感謝

P.S:我正在做的一切正確嗎?請讓我知道是否還有其他更好的方法...謝謝

+0

看看這個 - http://stackoverflow.com/questions/13148630/how-do-i-find-which-transaction-is-causing-a-waiting-for-table-metadata-lock-s/13155778#13155778 – Joddy

+0

this too http://stackoverflow.com/questions/2708237/php-mysql-transactions-examples –

回答

1

如果您正在執行DELETE命令,您可以通過調用mysql_affected_rows()函數來查看是否有任何受影響的行。

mysql_affected_rows - 取得前一次MySQL操作所影響的記錄行數

甚至有mention of use in conjunction with transactions文檔中 -

注:交易如果您正在使用事務,您需要在INSERT,UPDATE或DELETE查詢後調用 mysql_affected_rows(),而不是COMMIT後的。


這裏要注意的是,您使用的是舊版本的數據庫連接。請參見PHP文檔相關mysql_*命令的任何頁面上,你會遇到這樣的消息 -

這個擴展不贊成PHP 5.5.0,並且將在 將來被移除。相反,應該使用MySQLiPDO_MySQL擴展名。

+0

他怎麼會知道有多少行會受到影響,以便他可以確認交易已成功? –

+0

@pru - 受影響的行數必須與預期刪除的數目相匹配。 – Lix

+0

@Lix和一般情況下,如果我不刪除!?如果我只是插入多個表中......怎麼辦?如果AUTOCOMMIT = 0,我應該在哪裏使用AUTOCOMMIT = 0?謝謝 – behz4d