web-dev-qa-db-ja.com

JDBC接続のデフォルトのautoCommit動作

JDBCを使用してOracleに接続しています。私はconnection.setAutoCommit(false)connection.setAutoCommit(true)をテストしましたが、結果は期待通りでした。

デフォルトでは、接続はautoCommit(true) [間違っている場合は修正してください]のように機能するはずですが、connection.commit()が呼び出されるまでレコードは挿入されません。デフォルトの動作に関するアドバイスはありますか?

String insert = "INSERT INTO MONITOR (number, name,value) VALUES (?,?,?)";

conn = connection; //connection  details avoided
preparedStmtInsert = conn.prepareStatement(insert);
preparedStmtInsert.execute();

conn.commit();
23
stackex

Oracle JDBCドキュメント から:

接続が作成されると、自動コミットモードになります。つまり、個々のSQLステートメントはトランザクションとして扱われ、実行直後に自動的にコミットされます。 (より正確には、デフォルトでは、SQLステートメントは実行時ではなく、完了時にコミットされます。ステートメントは、すべての結果セットと更新カウントがただし、ほとんどすべての場合、ステートメントは実行直後に完了し、したがってコミットされます。

もう1つは、接続作成の詳細を省略しているため、私は推測しているだけです。フレームワークを使用している場合、またはデータソースまたは接続プールから接続を取得している場合、autocommitoffそれらのフレームワーク/プール/データソースによる-解決策は、デフォルト設定を決して信頼しないことです;-)

31
npe