2014-05-25 110 views
6

PHP PDO::commit()文檔聲明該方法在成功時返回TRUE或在失敗時返回FALSE。這是否指beginTransaction()和commit()之間語句執行的成功或失敗?PDO :: commit()成功或失敗

例如,從文檔:

$dbh->beginTransaction(); 
$sql = 'INSERT INTO fruit (name, colour, calories) VALUES (?, ?, ?)'; 
$sth = $dbh->prepare($sql); 

foreach ($fruits as $fruit) { 
    $sth->execute([ 
     $fruit->name, 
     $fruit->colour, 
     $fruit->calories, 
    ]); 
} 

$dbh->commit(); 

如果上述任何執行失敗,將在commit()方法,由於原子事務的「全有或全無的基礎」返回false?

+0

我真的不記得需要在代碼庫中提交,你有沒有嘗試過嗎? – Jonast92

+0

我不確定我是否理解。手動交易的目的是確保多個報表都是成功的,或者沒有。 –

+0

我認爲你在想這件事。如果在這種情況下失敗,那麼很可能所有的都會失敗,反之亦然。只需爲代碼添加適當的錯誤處理,並且如果您真的關心什麼是失敗,那麼只需將其記錄下來即可。我從來不必在服務器端代碼中使用提交,我發現你不太可能必須這樣做。 – Jonast92

回答

2

返回值基於pdo :: commit本身,而不是您要提交的事務。 當沒有事務處於活動狀態時,它返回FALSE,但每當它返回TRUE或FALSE時它不是很清楚。

事務中執行的查詢本身會成功或失敗。 使用Mr.Tk的例子,如果可能,事務將被提交,並且在「try」塊中執行查詢時沒有發生錯誤,並且如果在「try」塊內發生了錯誤,則回滾。

當只評估「try」塊內執行的查詢時,我個人會嘗試捕獲一個PDOException而不是一個正常的異常。

$dbh->beginTransaction(); 
try { 
    // insert/update query 
    $dbh->commit(); 
} catch (PDOException $e) { 
    $dbh->rollBack(); 
} 
0

我一直在做它喜歡的是:

$dbh->beginTransaction(); 

try { 
    // insert/update query 

    $dbh->commit(); 
} catch (Exception $e) { 
    $dbh->rollBack(); 
} 

並始終擔任魅力! :)

所以我認爲,在你的情況下,如果插入會失敗的應用程序應該拋出一個異常,並提交甚至不會觸發。

3

的關鍵部分是同時具有的try-catch僅做回滾是不需要設置PDO的異常模式,。因此,你的代碼是好的,沒有必要去改變它,如果你想要的是在失敗回滾,只要你有這行的地方:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

在出現故障的情況下,該腳本將被終止,連接關閉MySQL會很樂意爲你回滾事務。

如果你仍然想手動回滾,你應該正確地做,而不是像其他答案中說的那樣。確保

  • 你正趕上Exception,不PDOException,因爲它什麼都無所謂特定異常中止執行
  • 重新拋出異常回滾後,被通知的問題
  • 此外,表引擎支持交易(即對於Mysql,它應該是InnoDB,而不是MyISAM)。

該清單取自my article,您可能會發現在這個或許多其他方面也很有用。

+0

你確定嗎?如果我執行10個不同的插入或更新,並在最後一個pdo引發異常,所有9個其他句子回滾? –

+0

我同意@CarlosGoce:如果沒有明確的'begin/rollback'處理,它將不會回滾。但是,例外將有助於運行@TK所述的「回滾」。事實上,你甚至不回答關於'commit'的問題:如果你想取消以前發送的很多查詢,如果出現任何錯誤,事務就很有用。 – Yvan

+0

@Yvan肯定會回滾,因爲事務總是會以* close close *的形式回滾。但我寧願同意使用交易,如果正確使用,嘗試捕捉是有用的。 –