2017-01-16 17 views
1

例コード:PHP PDO実行時にトランザクションのロールバックが失敗しますか?

$pdo->beginTransaction(); 

try { 
    $query1 = $pdo->prepare(...); 
    $query2 = $pdo->prepare(...); 

    $query1->execute(); 
    $query2->execute(); 

    $pdo->commit(); 
} catch(Exception $e){ 
    try { 
     $pdo->rollBack(); 
    } catch(Exception $re){ 
     //... 
    } 

    //... 
} 

私は例外を投げることができる準備、および実行中のトランザクションがない場合に例外をスローしますコミット知っています。

しかし、準備が成功するが失敗するような状況が起こる可能性はありますか?ロールバックは発生しませんか?コミットは実行が失敗したときにもスローされます(私はそうは思わない、ドキュメンテーションはトランザクションがないときだけスローすると言う)。

だから私は明示的に実行結果を確認すると、次のようにロールバックを引き起こすことが私自身の例外を投げる?:

$pdo->beginTransaction(); 

try { 

    $query1 = $pdo->prepare(...); 
    $query2 = $pdo->prepare(...); 

    if(!$query1->execute()){ 
     throw new Exception('Query1 failed to execute.'); 
    } 

    if(!$query2->execute()){ 
     throw new Exception('Query2 failed to execute.'); 
    } 

    $pdo->commit(); 
} catch(Exception $e){ 
    try { 
     $pdo->rollBack(); 
    } catch(Exception $re){ 
     //... 
    } 

    //... 
} 
+1

あなたはPDOは、エラー – RiggsFolly

+0

上の例外をスローするように設定している。しかし、基本的に、あなたは、コミットトランザクションが – RiggsFolly

+0

PDO :: ROLLBACK(ロールバックする必要がありますを取得いけない場合)、それが開かれた前回せずにロールバックするために来るとき、 'PDOException'をスローしますトランザクション。 –

答えて

1

をすべきである私は(基本的に、あなたが求めている、実行しないと仮定)それならば、例外をスロー失敗する?

はい、あります。

したがって、コードは自動的にロールバックされます。手動でチェックする必要はありません。例えば重複したユニークなキーエラーでテストできます。

+0

ドキュメントには何かありますか? –

+0

はい。ドキュメンテーションによると、PDOはエラーが発生した場合に例外をスローします。私はむしろ、どこに例外を投げているのかだけを準備しているのか、どこで尋ねたのでしょうか。 –

+0

これは、ドキュメンテーションは明示的にprepareがfalseを返すため、pdoが設定されている場合にのみ例外をスローするためです。実行の場合、それはfalseを返すとしか言わず、例外を投げることについては何もないので、ドキュメンテーションは結果的ではないと言います(?)。 –

関連する問題