1. コミットモード
デフォルトは AutoCommit(SQLステートメントごとに自動的にコミットされる)
トランザクション処理を行う場合は明示的にAutoCommitを解除する必要があります。
具体的には Connection クラスの setAutoCommit メソッドを使います。
conn.setAutoCommit(false);
2. コミットとロールバック
AutoCommitを解除した場合はコミットまたはロールバックの
トランザクションを明示的に指定します。
conn.commit(); // トランザクション完了
conn.rollback(); // トランザクションのロールバック
3. 分離レベル
Oracle は (2)READ COMMITED と (4)SERIALIZABLE をサポートしています。
一般的(SQL92)には他に (1)READ UNCOMMITED と (3)REPEATABLE READ
があります。
(2) は(A)ダーティリードのみ対応
(4) は(A)ダーティリード
(B)リピータブルリード
(C)ファントムリード
すべて対応
具体的な記述
(2) conn.setTransactionIsolation(
Connection.TRANSACTION_READ_COMMITED);
(4) conn.setTransactionIsolation(
Connection.TRANSACTION_SERIALIZABLE);
補足
(A) ダーティリード
あるトランザクションがレコードを更新すると、
その内容が直ちに他のクライアントで読み込まれてしまうこと
(B) リピータブルリード
あるトランザクションがSELECT文を複数回実行したとき、
別のトランザクションで更新されたレコードから検索結果に
影響を及ぼされること
(C) ファントムリード
あるトランザクションがSELECT文を複数回実行したとき、
別のトランザクションで追加されたレコードが検索結果に
突然あらわれること
4. 明示的なレコードロック
(1)ロックしない
SELECT
(2)WAITロック
SELECT 〜 FOR UPDATE
(3)NOWAITロック
SELECT 〜 FOR UPDATE NOWAIT
ロック解除は commit または rollback によりおこなわれます。
5. サーブレットでトランザクション処理をおこなうときの注意事項
サーブレットで取得したコネクションでトランザクション処理を
おこなうのは無理があります。
実際どうすればよいのかという方法論です。
service メソッドで動的にインスタンスを生成する手法が
有効になります。
XXXX x = (XXXX)Class.forName(xxxx).newInstance();
ここで呼び出すクラス
(インタフェイス XXXX を implements するクラス)のメソッドで
トランザクション用のコネクションを新たに取得し、
トランザクションが済んだらクローズします
(参考文献)
北嶋伸安著 『Oracle8i/Javaプログラミング』アスキー出版局
IDGジャパン 『月刊ジャバワールド』 2000 6月号
|