トランザクションの有効範囲について、以下に説明します。
JDBCドライバを使用するアプリケーションでのトランザクション操作は、接続に対して行います。トランザクションはSQL文の操作を行うと開始され、commitまたはrollbackを実行することで終了します。JDBCドライバを使用するアプリケーションでは、SQL文の実行ごとに自動的にコミット処理を行う機能があります。これを自動コミットと呼びます。
データベースにデータを挿入する以下のようなアプリケーションがあるとします。
アプリケーションでSQL文に関する操作(準備、実行)を行ったタイミングで、トランザクションが開始されます。しかし、自動コミットが有効になっている場合、それぞれの操作を完了すると共にトランザクションはコミットされ、次の操作へ継続されません。
自動コミットが有効になっているかどうかはgetAutoCommitメソッドで確認する事ができます。データベースに対してコネクションを接続した直後は、自動コミットが有効になっています。
自動コミットが有効になっている場合、SQL文の実行ごとに自動的にコミット処理が行われます。しかし、一般的には複数のSQL文をひとまとめにして1つのトランザクションとして扱うことが多いです。
このような処理を行う場合、setAutoCommitメソッドで自動コミットを無効にします。
setAutoCommitメソッドで自動コミットを無効にした場合、接続に対してcommitメソッドまたはrollbackメソッドを実行して、明示的にトランザクションを終了させる必要があります。
SQL文の実行が何らかの原因でエラーとなりSQLExceptionが発生した場合にも、トランザクションは継続中となっています。SQLSTATEが40xx系以外の場合、rollbackメソッドを実行してトランザクションを終了させてください。
setAutoCommitメソッドはトランザクション中には実行できません。トランザクションの開始前またはトランザクションが終了している必要があります。
データベースの表tbl1にデータを挿入し、かつ別の表tbl2を更新するアプリケーションがあるとします。
自動コミットを無効にしたので、SQL文に関する操作(準備、データ設定、実行)を行っても、トランザクションはコミットされず、次の処理に継続されます。
ResultSetの保持機能
ResultSetの保持機能とは、コミット時にResultSetをクローズしない機能です。トランザクションが終了してもResultSetの操作を行う場合に使用します。
ResultSetの保持機能は、setHoldabilityメソッドで設定します。
以下の例ではコミット時にResultSetをクローズしないため、コミットした後にResultSetに対してカーソル操作を行うことができます。
ResultSetの保持機能を使用しない場合は、トランザクションを終了させたときに同一の接続でオープン中のResultSet(結果セット)はすべてクローズされます。ResultSetを使用中には結果をすべて取り出すまでトランザクションを終了させないようにしてください。
自動コミットが有効になっている場合、順方向カーソルの結果セットの最終行の取り出しが完了すると、コミット処理が行われます。
同一の接続に対して複数のResultSetを同時に使用している場合、どれか1つでもResultSetの最終行の取り出しが完了すると、最終行の取り出しが完了されていない他のResultSetはすべてクローズされます。
また、ResultSetを使用中に、executeUpdateメソッドを使用して他の更新系SQL文を実行した場合や、ResultSetの更新機能を使用して更新した場合、ResultSetはクローズされます。
複数のResultSetを同時に使用する場合、ResultSetを使用中に他の更新系SQL文を実行する場合、ResultSetの更新機能を使用する場合、およびバッチ更新機能を使用する場合は、自動コミットを無効にしてください。
バッチ更新機能については、“2.6.4 バッチ更新機能について”を参照してください。