3. トランザクション処理
JDBC 3章 トランザクション処理
3.1. 「java.sql.Connection」の自動コミットモード
デフォルトでは全てのSQL文は、個別のトランザクションとしてコミットされるようになっています。「java.sql.Statement」の「addBatch」メソッドで、以下のSQL文をバッチ処理している場合にも、
insert into product values(106,'Viz','compact car',100); update product set price=price*0.9 where price>=300; delete from product where p_num='111';
実質的には、以下をSQL文を実行している場合と同等になります。
begin; insert into product values(106,'Viz','compact car',100); commit; begin; update product set price=price*0.9 where price>=300; commit; begin; delete from product where p_num='111'; commit;
そのため途中のSQL文でエラーが発生しても、それまでの処理はデータベースに反映されます。
これは現在のデータベース接続が「自動コミットモード」になっているためです。自動コミットモードでは、1つ1つのSQL文に対してコミットが実行されます。現在、自動コミットモードになっているかどうか取得するには「getAutoCommit」メソッドを、設定するには「setAutoCommit」メソッドを使用します。自動コミットモードを解除すると、「commit」メソッドを明示的に呼び出さない限りデータベースには反映されません。「rollback」メソッドを呼び出した場合には、それまでのSQL文の実行が全て解除されます。
import java.sql.*; public class TransactionSample{ public static void main(String args[]) throws ClassNotFoundException,SQLException{ Class.forName("org.postgresql.Driver"); Connection connection=DriverManager.getConnection("jdbc:postgresql:Training","postgres",""); connection.setAutoCommit(false); Statement statement=connection.createStatement(); String sql="insert into product values(101,'Viz','compact car',100);"; statement.executeUpdate(sql); sql="update product set price=price*0.9 where price>=300;"; statement.executeUpdate(sql); sql="delete from product where p_num='111';"; statement.executeUpdate(sql); connection.commit(); } }
8行目で自動コミットモードをオフにしています。これ以降に実行されるSQLは全て、「commit」メソッドを呼ばないとデータベースに反映されません。11行目・14行目・17行目で変更SQLを実行していますが、19行目までデータベースに反映される事はありません。
(実習課題1)
2章実習課題3のプログラムを改良しなさい。
- テーブルのデータ更新をトランザクション処理に変更する。