2015/03/25

pgAdmin クエリツールでの rollback と commit

[pgAdmin][PostgreSQL]
昨日、クエリツールのメニューから Execute to file を使いました。同じメニューの中に「自動ロールバック」のオンオフ切り替えがあり ↓ この動作についてメモしておきます。実行環境は Windows 7 32bit + PostgreSQL Portable 9.4 + pgAdmin 1.20。


メニューでの設定と同じものがオプション内にあり ↓ 両者は連動しています。pgAdmin インストール直後はオンになっているはず。


↓ 公式ドキュメントでの説明に ... if a query fails とある通り、クエリ失敗時に自動でロールバックするか否かが変わります。ただ今日試した限りでは、自動ロールバック無効になるのはいくつかの条件が揃った時に限られるようです(後述)。

■ pgAdmin III 1.20.0 documentation ≫ ≫ pgAdmin Query tool Options
Enable Auto ROLLBACK - Check the box next to Enable Auto ROLLBACK to instruct the query tool to execute a ROLLBACK if a query fails.


例えば ↓ こんな風にクエリツールに三つ SQL を書き、二番目が正しくないとします。この三文を一括実行すると、自動ロールバックの設定は関係せず、常に全体がロールバックされます。従って一番目の正しい文も実行されません(テーブルが作られない)。


自動ロールバックの設定にかかわらず、クエリツールでの実行は基本的に単一トランザクションになり、最後に必ずコミット(失敗があればロールバック)されるようです。上のクエリは事実上 ↓ と同じになります。


いろいろ試してみると、自動ロールバック無効の設定が有効になるのは(ややこしい >_<)BEGIN だけ、または BEGIN + 正しいクエリを実行した場合の模様。例えば ↓ のように。


上の実行後 ↓ のようにクエリエラーが起きると、次のクエリを受け付けるか否かの挙動が、自動ロールバックの有無によって変わります。


自動ロールバックがオンなら、上のクエリエラーに対し自動的に前(先の BEGIN の前)に戻るので次のクエリを投げられます。一方オフだと、手動で COMMIT か ROLLBACK を実行しない限り、次に正しいクエリを投げても ↓ 受け付けません。current transaction is aborted, commands ignored until end of transaction block というメッセージのとおり、明示的にトランザクションが閉じられるまで命令が無視されます。


ただし ↓ のように BEGIN + … + 失敗するクエリを一括実行すると、自動ロールバックの設定に関わらず自動ロールバックされ、次のクエリを実行できる場合がありました。クエリウィンドウをいくつも開き、メニューでオンオフを切り替えて試しているうち、設定が錯綜したのかも。


psql での自動ロールバック設定については iakio さんの日記(エラーの後にロールバックしなければいけない理由)にあり、それと似てるようで微妙に違うような。まだ検証不足ですが、とりあえず pgAdmin でも自動ロールバックのオプション設定があるというメモまで。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。