5

プロジェクトでpg_connectとpg_queryを使用しています。しかし、それがAutoCommitモードを使用しているpg_connectであるかどうかは本当にわかりませんか?

重要な質問です。トランザクションの下でブロックを作成する必要があり、ステートメントの1つがサーバーによって無視されると、データベースに一貫性がなくなります...

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');

AutoCommitモードで動作しているので、それでも開始してコミットしますか?

あなたの助けをありがとう:dd

4

1 に答える 1

9

まず、PostgreSQL には AutoCommit モードがなく、PHP API の pg_* 関数は AutoCommit モードをエミュレートしようとしません。

pg_queryのドキュメントによると

複数のステートメントが関数に渡されると、クエリ文字列に明示的な BEGIN/COMMIT コマンドが含まれていない限り、それらは 1 つのトランザクションとして自動的に実行されます。

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;")

于 2012-03-14T22:57:37.907 に答える