(※ Mastodon に投稿した思考メモの原文。REPL 向け挙動の検討用)
PostgreSQL ではSQL をミスると即トランザクションが abort 状態になるのは、プログラムの一部として行われるのはいいけれども、REPL型のターミナル用DBクライアントではちょっと辛いなぁと思った
(1/5)
一般には、これの回避方法として、一時的な SAVEPOINT を設置してから SQL を実行し、成功なら SAVEPOINT を開放し、失敗ならその一時SAVEPOINT まで限定的に ROLLBACK するという方法がある。
(2/5)
まず考えたのは、この一時 SAVEPOINT 処理の自動化。だが、これはベテランユーザが扱うと、壊れると思っていたトランザクションが壊れてなかったということになり、これはこれで別の事故原因になりやすいという問題がある。よってボツ
(3/5)
次に考えたのは、prepare statement と execute を内部的に分離して、前者でエラーが発生した場合はトランザクションとは独立しているから、execute まで巻き込まずに終了させるという方法。これだとしょうもないタイポで abort する率がさがるので、少しだがストレスが軽減される。だが、これも一時 SAVEPOINT 処理の自動化と同様な誤解による事故の余地がある。ボツ
(4/5)
ならばと、自動でなくて、半自動ならばどうかということを考えた。try: insert into foo values('hoge') みたいに、先頭に try: がついていた時だけ「一時的な SAVEPOINT を設置してから SQL を実行し、成功なら SAVEPOINT を開放し、失敗ならその一時SAVEPOINT まで限定的に ROLLBACK する」ということをやるという方法。これ、どうなんだろうねぇ。
(5/5)