1

Postgres (psycopg) 接続を使用する場合の「自動コミット」の概念をよりよく理解しようとしています。新しい接続があり、その分離レベルをISOLATION_LEVEL_AUTOCOMMITに設定し、カーソルの開始/ロールバックメソッドを使用せずにこのSQLを直接実行するとします(演習として;実際にこれをやりたいとは言っていません):

INSERT A
INSERT B
BEGIN
    INSERT C
    INSERT D
ROLLBACK

INSERT C と D はどうなりますか?

自動コミットは、BEGIN の発行方法に影響する psycopg の純粋な内部設定ですか? その場合、上記の SQL は影響を受けません。INSERT A と B は完了するとすぐにコミットされますが、C と D はトランザクションで実行され、ロールバックされます。そのトランザクションはどの分離レベルで実行されますか?

それとも、自動コミットは接続自体の実際の設定ですか? その場合、BEGIN の処理にどのような影響がありますか? それは無視されますか、それとも実際にトランザクションを開始するために自動コミット設定をオーバーライドしますか? そのトランザクションはどの分離レベルで実行されますか?

それとも完全に的外れですか?

4

3 に答える 3

3

自動コミット モードは、各ステートメントが暗黙的にトランザクションを開始および終了することを意味します。

あなたの場合、自動コミットがオフの場合:

  • クライアントは、最初のステートメントのトランザクションを暗黙的に開始します
  • BEGIN、トランザクションがすでに開始されていることを示す警告を発行します
  • ROLLBACK、4 つのステートメントすべてをロールバックします。

自動コミットがオンの場合、cとのみdがロールバックされます。

PostgreSQLには内部AUTOCOMMIT動作がないことに注意してください8.0。すべての自動コミット機能はクライアントに依存しています。

于 2010-03-19T15:43:44.963 に答える
1

autocommit が psycopg にある場合、トランザクションを管理しようとせずに、すべてを PostgreSQL バックエンドに送信するだけです。BEGIN/COMMIT/ROLLBACK を使用しない場合、すべての .execute() 呼び出しはすぐに実行され、コミットされます。BEGIN/COMMIT/ROLLBACK コマンドを発行して、独自のトランザクション管理を行うことができます。当然のことながら、自動コミット モードでは、conn.commit() または conn.rollback() を呼び出すことはできません。これは、psycopg がトランザクションを追跡せず、.execute() を直接バックエンドに送信するだけだからです。

あなたの例では、A と B がコミットされ、C と D がロールバックされます。

于 2010-12-15T17:00:19.053 に答える
1

デフォルトでは、PostgreSQL は自動コミットをオンにしています。つまり、各ステートメントはトランザクションとして処理されます。例のように、明示的にトランザクションを開始するように指示すると、それらのアイテムは新しいトランザクションになります。

あなたの例では、A と B がコミットされ、C と D がロールバックされます。

于 2010-03-20T22:12:00.230 に答える