2012-03-14 19 views
4

私はプロジェクトでpg_connectとpg_queryを使用します。 しかし、私は本当にそれがpg_connect AutoCommitモードを使用しているかどうかわからないのですか?PHP:PGSQLドライバとAutoCommit?

私はトランザクションの下に、いくつかのブロックを記述する必要があり、文のいずれかがサーバーによって無視されるならば、データベースが不整合になるので、それはまた...、pg_queryを行う興味深い質問

重要な問題です実行後のコミット?例えば

は:

pg_query('begin; update table1...; update table2...; commit'); 

pg_query('begin;'); 
pg_query('update table1...;'); 
pg_query('update table2...;'); 
pg_query('commit'); 

と同じで、自動コミットモードで作業

pg_query('begin; update table1...; update table2...; commit'); 

あるので、それにもかかわらずで始まり、コミット?あなたの助けのための

ありがとう:DD

答えて

8

まず、何の自動コミットモードは、PostgreSQLに存在しないとPHPのAPIのPG_ *関数は1をエミュレートしようとしないでください。 docは、複数のステートメントが関数に渡されると、クエリ文字列に

を含め、明示的 BEGIN/COMMITコマンドがある場合を除き、それらは自動的に1つのトランザクションとして を実行している

を言う

pg_queryの

これにより、pg_query("UPDATE1 ..; UPDATE2...")が1つのトランザクションで実行され、データにすべてか、またはまったく影響を及ぼさないことが保証されます。

シーケンスが

pg_query("BEGIN"); 
pg_query("UPDATE1..."); 
pg_query("UPDATE2.."); 
pg_query("COMMIT"); 

データの整合性に関してpg_query("UPDATE1 ..; UPDATE2...")と同等です(半完成状態が起こることはできません)。

「明示的なBEGIN/COMMIT ...がない限り」という注釈は、これらがSQL文のチェーン全体の先頭と末尾にない場合にのみ関係します。 つまり、pg_query("BEGIN; update1; update2; COMMIT;");pg_query("update1; update2;")と同等ですが、(明らかに)pg_query("update1; COMMIT; update2;")

+0

これは新機能ですか? http://www.postgresql.org/docs/9.3/static/ecpg-sql-set-autocommit.html – Eddified

+0

@Eddified:いいえ、これは古いです。 [ECPG](http://www.postgresql.org/docs/current/static/ecpg.html)は暗黙的にトランザクションを開き、 "autcommit off"と呼ばれます。 [トランザクションの管理](http://www.postgresql.org/docs/current/static/ecpg-commands.html#ECPG-TRANSACTIONS)を参照してください。 –

関連する問題