JDBCのコネクションで

setAutoCommit(False)の状態で
insertもしくは、updateのsqlを流して、
commitを呼ばずにcloseした場合、
commitされるのでしょうか?rollbackされるのでしょうか?

環境は、Oracleですが、JDBCの仕様としては
どうなるのでしょうか?

回答の条件
  • 1人3回まで
  • 登録:2006/03/30 19:32:00
  • 終了:2006/03/31 18:12:22

ベストアンサー

id:bonlife No.2

回答回数421ベストアンサー獲得回数752006/03/31 09:56:33

ポイント100pt

ちょっとOracleのソースを探したかったのですが、見つけられませんでした。

(OTNあたりにも載ってそうな情報ですが…。)

上記の動作はいわゆる「暗黙のコミット」だと思います。

※ 暗黙コミット

COMMIT 命令を伴わないコミット操作。アプリケーションの正常終了時や DDL 実行の前後に発生する。

トランザクション中に DDL など実行しないよ? と思われるかもしれないがあるが、TRUCATE TABLE は DDL である。

conn.close()で接続が正常に終了しているため、暗黙コミットが働いているものと思われます。

SQL*Plusを使っている場合、commitと入力せずにexitなどでSQL*Plusを終了しても自動的にcommitされてしまう現象と同じだと思います。

他のRDBMSについては詳しくないのでよくわからないのですが、おそらくJDBCの仕様とは関係がなく、Oracleの仕様ではないでしょうか。

id:misoni

なるほど。参考になります。

sql*plusだとそうなりますね。

おっしゃる通り、Oracleの仕様のような気がしますね。

ありがとうございます。

2006/03/31 18:06:20

その他の回答(2件)

id:tomo_k No.1

tomo_k回答回数426ベストアンサー獲得回数262006/03/30 21:33:51

ポイント100pt

試しに実験してみました。

DBはOracle10g XEです。

開発環境はJDeveloper10gです

       try{
          conn = db.getConnection();
         conn.setAutoCommit(false);
         ps = conn.prepareStatement("insert into hoge values('foo','bar','boo')");
         ps.executeUpdate();
       } finally {
          try {
              conn.close();
          } catch (Exception e) {
              e.printStackTrace();
          }
       }

こんな感じのソースでやってみてJDevloperからDBをみてみると正常に挿入されているみたいです。

念のためSQLDeveloperでもみてみましたが、挿入されているみたいです。

id:misoni

コミットせずにクローズすると

コミットされてしまうのですね。。。

保証されている動作なのか気になるところです。

2006/03/31 01:51:11
id:bonlife No.2

回答回数421ベストアンサー獲得回数752006/03/31 09:56:33ここでベストアンサー

ポイント100pt

ちょっとOracleのソースを探したかったのですが、見つけられませんでした。

(OTNあたりにも載ってそうな情報ですが…。)

上記の動作はいわゆる「暗黙のコミット」だと思います。

※ 暗黙コミット

COMMIT 命令を伴わないコミット操作。アプリケーションの正常終了時や DDL 実行の前後に発生する。

トランザクション中に DDL など実行しないよ? と思われるかもしれないがあるが、TRUCATE TABLE は DDL である。

conn.close()で接続が正常に終了しているため、暗黙コミットが働いているものと思われます。

SQL*Plusを使っている場合、commitと入力せずにexitなどでSQL*Plusを終了しても自動的にcommitされてしまう現象と同じだと思います。

他のRDBMSについては詳しくないのでよくわからないのですが、おそらくJDBCの仕様とは関係がなく、Oracleの仕様ではないでしょうか。

id:misoni

なるほど。参考になります。

sql*plusだとそうなりますね。

おっしゃる通り、Oracleの仕様のような気がしますね。

ありがとうございます。

2006/03/31 18:06:20
id:yyok No.3

yyok回答回数59ベストアンサー獲得回数32006/03/31 12:06:24

ポイント100pt

JDK5.0のAPIドキュメントには、Connectionの説明にこんなことが書いてあります。

> 注: 各文を実行後、デフォルトでは、Connection オブジェクトは自動

> コミットモードになり、自動的に変更をコミットします。自動コミット

> モードが無効にされている場合、変更をコミットするにはメソッド

> commit を明示的に呼び出す必要があります。そうしないとデータベー

> スの変更は保存されません。

厳密には保証されてないようです。

id:misoni

"保存されません。" = "コミットされません"

だと嬉しいのですが。。

そうは、いかないようですね。

commitを止めたい時は、rollbackを明示的に入れるないと

問題が置きそうですね。

2006/03/31 18:11:39

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません