LoginSignup
7
7

Pgadminでトランザクションがアボートしたときには

Last updated at Posted at 2019-07-29

案外この対応に苦慮していたのですが、これだけで解決します。Pgadminを操作していると、このメッセージに遭遇することがあります。

トランザクションがアボートしました

そんなときは、PgadminのSQLビューアを開いて、これだけを記述してクエリを実行してください。

commit;

こうすれば、再びSQLコマンドを受け付けるようになります。

どういうことなのか?

postgreSQLは基本、処理の命令と実行を分けており、commitコマンドの実行によって、初めて挿入、更新、ロールバック(差し戻し)などの処理が実行されます。そして、基本はauto commitがデフォルトとなっています。

そして、データを挿入、更新しようとしてクエリを記述して命令しても、制約などに違反(同値のユニークキーを挿入しようとした、設定カラム数以上のカラムを挿入しようとした、など)が生じると、エラーメッセージが表示され、クエリ実行時に記述された命令すべてをロールバック(差し戻し)する仕様になっており、一旦、待機状態となります。

したがって、auto commit(自動コミット)を何らかの理由でオフに制御していると、一度待機しているロールバックを実行しないと、以後のコマンドを一切受け付けつけてくれずに、トランザクションがアボート(休止)しましたと、上記のメッセージが表示されることになります。

ですが、その解決策としてcommit;という命令文を一つ記述するだけでロールバックを実行してくれるので、SQL文にcommitと記述すればいいのです。

データが反映されない場合

こっちも知らないと引っかかりがちですが、auto commitをOFFにしている場合、insert文やupdate文、delete文やalter文などといったデータ更新に関する命令文をクエリで実行した後は、必ず最終行に

commit;

この一行を忘れないでください。これを行わないとデータ変更処理を受け付けてくれなくなり(というより、コミット《実行》されていないので、待機状態となっている)トラブルの元になります。そして、このcommitを受け付けていない状態で、新たなデータ更新に関わるSQL文を実行したりすると同様にトランザクションがアボートしてしまいます。

ですので、Pgadminは必ず

結果にコミットすること

これを心がけましょう。それが言いたいだけだろ自分

※select文はデータを呼び出すだけなので、命令実行後にcommitはなくても問題ありません。

そもそものトラブルを防止したい

安全対策などでautocommitをoffに制御していない限りは、autocommitをonにしておいたほうがいい気もします。セキュリティ的なリスクより、commitを忘れ、必要なデータを投入、更新できていない(特に定期的にメンテをかけたりするケース)ことの方が問題が大きくなると判断した場合はそのようにした方がいいでしょう(要はどちらに重きを置くかです)。

auto commitをSQLで修正するためのコマンド

postgres=# \set AUTOCOMMIT on
postgres=# \echo :AUTOCOMMIT
on                                   /*このように表示される

このように定数に代入されて表示されますので、AUTOCOMMITは必ず英半角大文字にしてください。小文字にするとただ、:autocommitという文字列をechoするだけになります。

参考になったサイト

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7