| Symfoware(R) Server JDBCドライバユーザーズガイド - FUJITSU - |
目次
索引
![]()
|
第3章 アプリケーションの考え方
3.2 トランザクション
トランザクションの有効範囲について、以下に説明します。
JDBCドライバを使用するアプリケーションでのトランザクション操作は、接続に対して行います。トランザクションはSQL文の操作を行うと開始され、commitまたはrollbackを実行することで完了します。JDBCドライバを使用するアプリケーションでは、SQL文の実行ごとに自動的にコミット処理を行う機能があります。これを自動コミットと呼びます。
例えば以下に示すようなデータベースにデータを挿入するアプリケーションがあるとします。
Connection cnct = DataSource.getConnection(); String sSQLInsert = "insert into tbl2(c_int,c_char) values(?,?)"; PreparedStatement pstmt = cnct.prepareStatement(sSQLInsert); pstmt.setInt(1,c_int_dat); pstmt.setString(2,c_char_dat); pstmt.executeUpdate(); : |
アプリケーションでSQL文に関する操作(準備、データ設定、実行)を行ったタイミングで、トランザクションが開始されます。しかし、自動コミットが有効になっている場合、それぞれの操作を完了すると共にトランザクションはコミットされ、次の操作へ継続されません。
自動コミットが有効になっているかどうかはgetAutoCommitメソッドで確認する事ができます。データベースにコネクションした直後は、自動コミットが有効になっています。
自動コミットが有効になっている場合、SQL文の実行ごとに自動的にコミット処理が行われます。しかし、一般的には複数のSQL文をひとまとめにして1つのトランザクションとして扱うことが多いです。
このような処理を行う場合、setAutoCommitメソッドで自動コミットを無効にします。
setAutoCommitメソッドで自動コミットを無効にした場合、接続に対してcommitメソッドまたはrollbackメソッドを実行して、明示的にトランザクションを完了させる必要があります。
SQL文の実行が何らかの原因でエラーとなりSQLExceptionが発生した場合にも、トランザクションは継続中となっています。rollbackメソッドを実行してトランザクションを完了させてください。
setAutoCommitメソッドはトランザクション中には実行できません。トランザクションの開始前またはトランザクションが完了している必要があります。
例えば以下に示すようなデータベースの表tbl1にデータを挿入し、かつ別の表tbl2を更新するアプリケーションがあるとします。
Connection cnct = DataSource.getConnection();
cnct.setAutoCommit(false);
try{
String sSQLInsert = "insert into tbl1(c_int,c_char) values(?,?)";
PreparedStatement pstmt1 = cnct.preparedStatement(sSQLInsert);
pstmt1.setInt(1,c_int_dat);
pstmt1.setString(2,c_char_dat);
pstmt1.executeUpdate();
String sSQLUpdate = "update tbl2 set c_num=c_num+1 where c_num=?";
PreparedStatement pstmt2 = cnct.preparedStatement(sSQLInsert);
pstmt2.setInt(1,c_int_dat);
pstmt2.executeUpdate();
pstmt1.close();
pstmt2.close();
cnct.commit();
}
catch( SQLException ex ){
cnct.rollback();
}
: |
自動コミットを無効にしたので、SQL文に関する操作(準備、データ設定、実行)を行っても、トランザクションはコミットされず、次の処理に継続されます。
SQL文が正常に実行されるとSQL文の条件を満たす行の集合結果(結果セット)が作成されます。ResultSetを使用して結果セットの取り出し中に、トランザクションを終了させた場合、ResultSetはクローズされます。ResultSetを使用中には結果セットをすべて取り出すまでトランザクションを完了させないようにしてください。
自動コミットが有効になっている場合、順方向カーソルの結果セットの最終行の取り出しが完了すると、コミット処理が行われます。
同一の接続に対して複数のResultSetを同時に使用している場合、どれか一つでもResultSetの最終行の取り出しが完了すると、最終行の取り出しが完了されていない他のResultSetはすべてクローズされます。
また、ResultSetを使用中に、executeUpdateメソッドを使用して他の更新系SQL文を実行した場合も、ResultSetはクローズされます。
複数のResultSetを同時に使用する場合や、ResultSetを使用中に他の更新系SQL文を実行する場合、自動コミットを無効にして下さい。
目次
索引
![]()
|