2012-05-08 13 views
12

PDOトランザクションブロック内でファンクションコールが発生することはありますか?この単純化されたコード(使用してMySQLデータベース)...この場合はPDOトランザクションとファンクションコール

try{ 
    $db->beginTransaction(); 

    // call to function that creates user 
    $user_id = create_user(); 

    // call to function that creates company  
    $company_id = create_company(); 

    // call to function to link user & company 
    add_user_to_company($user_id, $company_id); 

    $db->commit(); 
} 

は、トランザクションを使用して起こることはできませんが、お勧めの戦略は何ですか?

答えて

11

これらの関数呼び出しのいずれも、トランザクション自体をオープンまたはコミットしようとしないか、$dbに格納されているものとは異なる接続を使用しない限り、うまく動作します。 PDOオブジェクト(またはその問題のRDBMS)は、PHPで他の関数を呼び出すかどうか知りません。 $dbで開かれているものと同じオープン接続上でアクションが実行されているかどうかがわかります。これらの関数は、パラメータとして$dbを受け取るか、それをグローバルにアクセスすると仮定します。

PDOはトランザクション状態(PDO::inTransaction()を通じて公開)を追跡しますが、PDOやPHPアプリケーションコードではなく、トランザクション状態を管理しているRDBMSです。前のトランザクションがコミットされる前に関数が新しいトランザクションを開こうとすると、トランザクションネストをサポートしていないため、MySQL's documented behaviorは前のトランザクションを自動コミットします。

したがって、追加の関数呼び出しがトランザクション状態を変更しようとしていないことを確認してください。

+1

さらに明確にするために、ネストされたトランザクションはMySQLではサポートされていないため、機能の中でトランザクションを開始していないことを確認してください。そうしないと、[自動的に保留中のトランザクションをコミットします](http://dev.mysql .com/doc/refman/5.5/en/implicit-commit.html)。 –

+1

また、DDL(作成/変更/ドロップ文)は、実行していたトランザクションをコミットするため、使用しないでください。 – Kris

関連する問題