|
|
 |
連載
JDBC
トランザクション処理 |
|
1.トランザクションとは
トランザクションとは、データベースの整合性を保つために、それ以上分割できない処理単位のことです。
一般的には1つのプログラムが1トランザクションということになります。
意味のある処理単位としてのトランザクションは、その処理中に異常が発生すると、トランザクションの開始前の状態に戻されます。
その意味でトランザクションは回復の単位とも言えます。
データベースの処理では、トランザクションが正常に終了したならばデータベースの反映を保証し(コミット: commit)、
異常終了したならばデータベースには一切反映しない(ロールバック: rollback)ということです。
|
 |
 |
| トランザクションでない場合の予約衝突例 |
|
 |
| |
2.トランザクション処理
デフォルトでは execute系のメソッドを実行した段階で自動でコミットされるので、この自動コミット機能をオフさせる必要があります。
これには connectionオブジェクトの setAutoCommitメソッドを falseの引数で呼び出すことになります。
この時点でトランザクションが開始され、現在の処理は「別メモリ」上で更新作業が始まります。
後はconnectionオブジェクトの commitメソッドか rollbackメソッドを呼び出した時点でトランザクション終了ということになります
正常ならば commitメソッドで「別メモリ」上での更新作業をデータベースに反映させ、異常ならば rollbackメソッドで「別メモリ」を消去し、元に戻すだけです。
但し、トランザクションの途中で setAutoCommitメソッドを trueで呼び出したり、結果セットを得る参照系のSQLを発行した時点でコミットされてしまいます。
|
3.トランザクション処理の例
データベースの接続後のトランザクション処理の例を、前回の「バッチ更新」時に適用した場合の例を下記に示します。
|
 |
| |
try {
conn.setAutoCommit(false); // 自動コミットオフ
Statement stmt = conn.createStatement();
stmt.addBatch(
"INSERT INTO DB0201 (ID, name, score1, score2)"
+"VALUES (10, 'hayashi', 100, 90)");
stmt.addBatch(
"INSERT INTO DB0201 (ID, name, score1, score2)"
+"VALUES (11, 'kobayashi', 90, 80)");
stmt.addBatch(
"INSERT INTO DB0201 (ID, name, score1, score2)"
+"VALUES (12, 'obayashi', 90, 100)");
int[] updateCnt = stmt.executeBatch();
conn.commit(); // コミット(正常処理)
} catch (SQLException e) {
conn.rollback(); // ロールバック(異常処理で元に戻す)
}
|
|
| トランザクション処理の例 |
|
| |
|
|