読者です 読者をやめる 読者になる 読者になる

JDBCでAutoCommitがOFFのときのCOMMIT,ROLLBACK後のbeginトランザクションについて

自分が触っているシステムで以下のようなコードを目にした。

...
connection.setAutoCommit(false);
...
connection.rollback();
...
stmt = connection.createStatement();
stmt.execute("begin");
...


トランザクションは結構やっていたが、初めてBEGINコマンドを実行しているコードを見た。
一度ROLLBACKやCOMMITしてトランザクションが終わり、再度新しいトランザクションを開始する場合、BEGINしなくてもいいのだろうか?と疑問が出てきた。
しかし、DBのログを見たところあまりに大量のBEGINコマンドを発行していた。
2回連続発行してあったりした。

それで検証してみた。

以下のコードを実行する。

...
connection.setAutoCommit(false);
stmt = connection.createStatement();
stmt.execute("/* Rollbackの前です。 */");
stmt.close();

connection.rollback();

stmt = connection.createStatement();
stmt.execute("/* Rollbackの後です。 */");
stmt.close();
...

結果

/* Rollbackの前です。 */
ROLLBACK
begin
/* Rollbackの後です。 */

4行目の"begin"はコードには書いていないが、DBではしっかり発行していた。
setAutoCommit(false)はTransactionの暗示的な開始とのこと。
だから、BEGINコマンドは発行していない。
しかし、ROLLBACKやCOMMIT後に再度トランザクションを開始しようとすると、
自動でBEGINが実行される。

感想:
JDBC様ありがとうございました!