自動コミットモードを無効にして、トランザクションを手動でコミットおよびロールバックするプログラム例について説明します。自動コミットモードを無効化することで、データベースへ更新結果を反映するタイミングを、アプリケーション内で制御することができます。
このサンプルアプリケーションでは、IDが1の列に対して、NAMEの情報をwhaleに更新しています。更新処理終了後、commitメソッドを使用して、データベースに更新処理を反映しています。
更新処理の反映後、更新結果確認のため、データを参照しています。
更新処理や参照処理の途中でエラーが発生した場合、rollbackメソッドを使用して、トランザクションをロールバックしています。
以下のサンプルアプリケーションでは、myhostというホストで起動しているJDBCネーミングサービスから、ds1というJDBCデータソースの情報を取得しています。ホスト名やデータソース名については、アプリケーションの実行環境に合わせて修正してください。
// 以下のパッケージをインポートします。
import java.util.*;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
// クラスを定義します。
public class MyTransactionHandling
{
public static void main(String args[])
{
DataSource ds = null;
Connection con = null;
Statement stmt1 = null;
Statement stmt2 = null;
ResultSet rs = null;
int iID = 0;
String sName = null;
try
{
// JNDI環境を指定します。
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory");
env.put(Context.PROVIDER_URL,"SYM://myhost:26600");
InitialContext ctx = new InitialContext(env);
// JDBCデータソースを取得します。
ds = (DataSource)ctx.lookup("jdbc/ds1");
// データベースと接続します。
con = ds.getConnection();
// 自動コミットモードの無効化
con.setAutoCommit(false);
// Statementのオブジェクトを生成します。
stmt1 = con.createStatement();
// IDが1の行に対して、UPDATE文を実行します。
// NAMEを'whale'に変更します。
stmt1.executeUpdate("UPDATE GENERAL.EMPLOYEE SET NAME= 'whale' WHERE ID=1");
// Statementのオブジェクトをクローズします。
stmt1.close();
// トランザクションをコミットし、更新を反映します。
con.commit();
// Statementのオブジェクトを生成します。
stmt2 = con.createStatement();
// SQL文を実行し、ResultSetの
// オブジェクトを生成します。
rs = stmt2.executeQuery("SELECT ID,NAME FROM GENERAL.EMPLOYEE");
while(rs.next())
{
// ResultSetの列に対応する
// データを取得します。
iID = rs.getInt(1);
sName = rs.getString(2);
// 取得した情報を表示します。
System.out.println("ID = " + iID);
System.out.println("NAME = " + sName);
}
// ResultSetのオブジェクトをクローズします。
rs.close();
// Statementのオブジェクトをクローズします。
stmt2.close();
// トランザクションをコミットします。
con.commit();
}
// SQLExceptionが発生した場合の処理を記述します。
catch (SQLException e)
{
// エラー情報を出力します。
System.out.println("ERROR MESSAGE : " + e.getMessage());
System.out.println("SQLSTATE : " + e.getSQLState());
System.out.println("ERROR CODE : " + e.getErrorCode());
e.printStackTrace();
try
{
if (con != null)
{
// トランザクションをロールバックします。
con.rollback();
}
}
// Exceptionが発生した場合の処理を記述します。
catch (Exception ex)
{
// スタックトレースを出力します。
System.out.println("ERROR MESSAGE : " + e.getMessage());
e.printStackTrace();
}
}
// その他のExceptionが発生した場合の処理を記述します。
catch (Exception e)
{
// スタックトレースを出力します。
System.out.println("ERROR MESSAGE : " + e.getMessage());
e.printStackTrace();
try
{
if (con != null)
{
// トランザクションをロールバックします。
con.rollback();
}
}
// Exceptionが発生した場合の処理を記述します。
catch (Exception ex)
{
// スタックトレースを出力します。
System.out.println("ERROR MESSAGE : " + e.getMessage());
e.printStackTrace();
}
}
finally {
try
{
if (con != null)
{
// Connectionのオブジェクトをクローズします。
con.close();
}
}
// Exceptionが発生した場合の処理を記述します。
catch (Exception ex)
{
// スタックトレースを出力します。
System.out.println("ERROR MESSAGE : " + ex.getMessage());
ex.printStackTrace();
}
}
}
}