2011-12-22 14 views
0

2人の異なるクライアントがpdo :: beginTransactionを持つ同じphp関数を呼び出すとどうなりますか?PDO beginTransaction 2つの別々のスクリプト

いずれかが失敗するか、またはPHPの2つのインスタンスがbeginTranscationコミットブロックの内容を実行できますか?

IE:

try{ 
db::beginTransaction(); 
//queries here 
//can two separate php instances go in here at the same time? 
db:commit(); 
} 
catch(error e) 
{ 
db::rollback(); 
} 
+1

これは使用しているデータベースによって異なりますが、通常、トランザクションは接続ごとに処理され、すべての現代のデータベースはそれぞれ複数のトランザクションで複数の接続をサポートします。 – deceze

答えて

2

PHPスクリプト(より正確には、PDOの各インスタンス)の各インスタンスは(DBの観点から、新しいセッション)データベースへの接続を開きます。バックエンドデータベース(いくつかのフラットファイルを除く)は、複数の接続をサポートしますが、個々のリソースを別々にロックしてしまいます。トランザクションで実行されたクエリによっては、デッドロックが発生する可能性があります。つまり、同時に開いているデータベースへの複数の接続を持っていても必ずしもデッドロックのシナリオになるとは限りません。

+0

しかし、両方のファイルがincludeを含む1つのページに含まれている場合は、複数のスクリプトではありませんので、1回だけデータベース接続を行い、正しく回すことができますか? – phpmeh

+0

同じPDOインスタンスを使用しているかどうかによって異なります。 PHPスクリプトを使用している間は、同じDBに複数の接続を持つことができますが、特別な理由がない限り、推奨されません。ベストプラクティスは、PHPリクエストごとに1つの接続を使用することです。 – Kenaniah

+0

私はスクリプトごとに1つのPDOオブジェクトしか使用せず、スクリプトの先頭でのみ接続し、最後にそれを終了します。 –

関連する問題