2016-05-20 9 views
0

私はかなり新しいトランザクションです。PHP、MySQL、PDOトランザクション - tryブロック内のコードはcommit()で停止しますか?

前に、私が何をやっていたようなものだった:

$db = new PDO(...); 

$stmt = $db->prepare(...); 

if($stmt->execute()){ 
    // success 
    return true; 
}else{ 
    // failed 
    return false; 
} 

しかし、単一のトランザクションにグループの複数のクエリへの試みで、ブロック1

コード、私は今のようなものを使用しています:

コードブロック2

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

$db->beginTransaction(); 

try{ 
    $stmt = $db->prepare(... 1 ...); 
    $stmt->execute(); 

    $stmt = $db->prepare(... 2 ...); 
    $stmt->execute(); 

    $stmt = $db->prepare(... 3 ...); 
    $stmt->execute(); 

    $db->commit(); 

    return true; 
}catch(Exception $e){ 
    // Failed, maybe write the error to a txt file or something 
    $db->rollBack(); 
    return false; 
} 

私の質問は:取引が何らかの理由で失敗した場合、コードは$db->commit();に止まり、catchブロックにジャンプしますか?またはreturn true;が最初に実行され、catchに移動しようとしますか?もしそうなら、私はすでに戻ってきたので、catchには行かないでしょう。それは間違った価値を返してしまったはずです。

コード・ブロック3

if($stmt->commit()){ 
    return true; 
} 

か、それは十分な私はそれがコードブロック2に書かれている方法です。

は、私はまだのようなものを含める必要がありますか?

+1

はい、コードが '$ db-> commit();'で止まったら 'catch 'ブロックの出力が返されますので、' if'のような条件を追加する必要はありません($ stmt-> commit()).... 'http://php.net/manual/en/pdo.transactions.php – pes502

答えて

1

トランザクションが何らかの理由で失敗した場合、コードがエラーが最後に発生した非常にラインでを停止し、その後、実行はcatchブロックに直接ジャンプ。したがって、コードブロック2に書かれた方法で十分です。

は、ロールバック後に常に例外を再スローする必要があります。そうでなければ、何が問題か分からないでしょう。だから、

try{ 
    $stmt = $db->prepare(... 1 ...); 
    $stmt->execute(); 

    $stmt = $db->prepare(... 2 ...); 
    $stmt->execute(); 

    $stmt = $db->prepare(... 3 ...); 
    $stmt->execute(); 

    $db->commit(); 

    return true; 
}catch(Exception $e){ 
    $db->rollBack(); 
    throw $e; 
} 
+0

'throw $ e;'は何をしますか? '$ e-> getMessage()'で例外にアクセスすることはできませんか? – Birrel

+0

あなたはそうすることはできません。例外は、適切な場所で正しく処理されることは想定されていません。それはプログラミングです。処理コードは、クエリを実行するたびに書き込まず、一度だけ記述します。また、あなたはいつかあなたの心を変え、ロギング以外のエラーを処理する別のアイデアがありますか?大量書き直しのために設定されますか? –

+0

さらに、この特定のケースでは、PHPはすでにエラーをログに記録することができます。あなたがログを記録する必要がある場合には、 'ini_set( 'log_errors'、1);' 1 –

0

あなたが何らかのエラーに直面している場合は、例外がスローされたときに実行が停止され、この

catch(Exception $e){ 
    $db->rollBack(); 
    // Failed, maybe write the error to a txt file or something 
    return false; 
} 
+0

Amit、ありがとう。私は質問にその行を入れるのを忘れましたが、それは私のコードにあります。しかし、あなたの答えは私の質問には答えません。ロールバックは私の心配ではなく、 '$ stmt-> commit();'行を越えて存在するかもしれないコードです。 – Birrel

+0

トランザクションコードに失敗した場合は、catchブロックに移動します。 catchブロック内にあるコードはすべて実行されます。 –

1

のようにすべてのトランザクションをロールバックするためにこれを行うことができます。

最初のリターンには到達しませんが、catchステートメントが実行されます。

あなたも直接コミット返すことができます。

$dbh->beginTransaction(); 
try { 
    // insert/update query 
    return $dbh->commit(); 
} catch (PDOException $e) { 
    $dbh->rollBack(); 
    return false; 
} 
関連する問題