6.トランザクション

データベースの一連の更新処理がトランザクションです。Java の JDBC API を Aplication 版で、MySQL を前提に説明します。

(1) JDBC API ( Transaction )


 更新処理では、connection インタフェースの commit と rollback メソッドが使われます。これらのメソッドは、自動コミットモードが無効のときに使用します。
 尚、MySQL は COMMIT-ROLLBACK をサポートしていません。Exception error が発生し、ROLLBACK を実行した時点で、エラーになります。ACCESS データベースなら動作します。MySQL はトランザクション処理を省く (commit/rollback ができない) ことによって高速化を実現しています ..
・public void commit() throws SQLException

直前のコミット/ロールバック以降に行われた変更をすべて有効とし、Connection が現在保持するデータベースロックをすべて解除します(一連の更新処理を完結)。

・public void rollback() throws SQLException

直前のコミット/ロールバック以降に行われた変更をすべて無効とし、Connection が現在保持するデータベースロックをすべて解除します(更新前に復元される)。

 次の例は、データベース(MySQL)を更新する Java Aplication のスタイルです。

// HelloWorldTranMySQLJDBC.java for  MySQL
import java.sql.*;				// java.sql 必須

public class HelloWorldTranMySQLJDBC {
  public static void main(String[] args) {

    Connection con = null;
    Statement stmt = null;
    String german = "ドイツ語";
    String spain  = "0x83588379834383938cea";	// スペイン語
    String fran   = "Bonjour, tout le monde";

    try {
      Class.forName("org.gjt.mm.mysql.Driver");	// ドライバクラスロード
      // データベースへ接続
      con = DriverManager.getConnection
      ("jdbc:mysql:///hellodb?useUnicode=true&characterEncoding=SJIS");

      System.out.println("comit=" + con.getAutoCommit());     // true を表示
      con.setAutoCommit(false);            // 自動コミットモードを解除
      stmt = con.createStatement();        // ステートメントオブジェクト生成

      /** 処理1 変数 **/
      String sql = 
        "INSERT INTO hello_world_table VALUES(3,'" + german + "','Hallo Welt')";
      stmt.addBatch(sql);

      /** 処理2 リテラル **/
      stmt.addBatch
        ("INSERT INTO hello_world_table VALUES(4,'フランス語','"+fran+"')");

      /** 処理3 16 進 スペイン語 **/
      stmt.addBatch("INSERT INTO hello_world_table VALUES(5,"
                          + spain + ",'Hola Mundo')");

      stmt.executeBatch();		// バッチを実行

      con.commit();			// コミット
    } catch (Exception e) {
      e.printStackTrace();
      try {
        con.rollback();		// ロールバック
      } catch (SQLException ex) {
        e.printStackTrace();
      }
    } finally {
      // データベースへの接続をクローズ
      try {
        if (stmt!=null) {
          stmt.close();
        }
        if (con!=null) {
          con.close();
        }
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
}

?useUnicode=true&characterEncoding=文字コード

 サーバの文字コードを指定するオプションです。マルチバイトを含んだSQL文は指定する必要があります。日本語を扱う場合、 windows 環境では、シフトJIS( SJIS )、UNIX では、EUC ( EUC_JP )です。

con.getAutoCommit , con.setAutoCommit

 自動コミットモードを参照したり、更新できます。「 mysql> SET AUTOCOMMIT=0; 」でも解除できます。デフォルトで、commit を勝手に行うモードになっているので、例のように true が表示されます。

addBatch(String sql)

 Statement の現在のコマンドのバッチに SQL 文を追加します。

public int[] executeBatch()

 コマンドのバッチをデータベースに送信して実行します。戻り値はバッチ内のコマンドごとに 1 つの要素が格納されている更新カウントの配列です。この配列はコマンドがバッチに挿入された順序で並べられています。

※MySQL テーブル 定義の内容 ==> hello_world_table
実行結果
C:\java_test> javac HelloWorldTranMySQLJDBC.java

C:\java_test> java HelloWorldTranMySQLJDBC
commit true
C:\java_test> mysql
mysql> use hellodb 
Database changed
mysql> select * from hello_world_table;
+----+------------+------------------------+
| NO | LANGUAGE   | MESSAGE                |
+----+------------+------------------------+
|  1 | 日本語     | こんにちわ 世界       |
|  2 | 英語       | Hello World            |
|  3 | ドイツ語   | Hallo Welt             |
|  4 | フランス語 | Bonjour, tout le monde |
|  5 | スペイン語 | Hola Mundo             |
+----+------------+------------------------+
5 rows in set (0.13 sec)
mysql>


 尚、MySQL はフリーのリレーショナルデータベースです。そのインストールやDBの作成等の詳細は、ホームの「DB」を参照してください。また、MySQL JDBC ドライバも入手しないと、実行できません。

   MySQL ダウンロード    MySQL JDBC ダウンロード

mysql の insert コマンドで、日本語指定はOKでした。Java からINSERT するときは、文字コードを指定しないと文字化けします。また、SQL文中に「'」「"」「\」を含ませる場合はエスケープ文字を用いて「\'」「\"」「\\」とします。


前の章(5.JDBC API ( Applet ))    次の章(7.JDBC-ODBC brige )