13

PDO トランザクション ブロック内で関数呼び出しを実行できますか? これは単純化されたコードです (MySql データベースを使用)...

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();  
}

トランザクションを使用してこれが起こらない場合、推奨される戦略は何ですか?

4

1 に答える 1

14

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

PDOはトランザクションの状態(を介して公開)を追跡しますPDO::inTransaction()が、実際にはトランザクションの状態を管理しているのはRDBMSであり、PDOやPHPアプリケーションコードではないことに注意してください。前のトランザクションがコミットされる前に関数が新しいトランザクションを開こうとした場合、MySQLの文書化された動作は、トランザクションのネストをサポートしていないため、前のトランザクションを自動コミットすることです。

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

于 2012-05-08T14:07:29.227 に答える