ページの先頭行へ戻る
Symfoware Server V12.1.x アプリケーション開発ガイド(JDBCドライバ編)
FUJITSU Software

A.9 トランザクションを手動で制御する

自動コミットモードを無効にして、トランザクションを手動でコミットおよびロールバックするプログラム例について説明します。自動コミットモードを無効化することで、データベースへ更新結果を反映するタイミングを、アプリケーション内で制御することができます。

このサンプルアプリケーションでは、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();
            }
        }
    }
}