6.6.4 トランザクション制御

ここでは,トランザクション制御について説明します。

<この項の構成>
(1) トランザクションの開始と終了
(2) トランザクションの範囲

(1) トランザクションの開始と終了

トランザクションは,ユーザアプリケーションプログラムで明示的に開始と終了を指定して制御できます。明示的に制御しない場合は,トランザクションはメソッドごとに開始・終了されます。

トランザクションは,DbjSession#beginメソッドによって開始します。明示的に開始したトランザクションは,DbjSession#commitメソッドまたはDbjSession#rollbackメソッドによって終了させます。DbjSession#commitメソッドを実行した場合は,トランザクション内の処理が確定されます(コミット)。DbjSession#rollbackメソッドを実行した場合は,トランザクション内の処理が取り消されます(ロールバック)。エラーが発生した場合,明示的にDbjSession#rollbackメソッドを実行し,ロールバックしてください。

明示的に終了しない場合でも,DbjSession#logoutメソッドまたはDocumentBrokerサーバのタイムアウトによって文書空間との接続が切断されたときには,ロールバック処理が実行されて,トランザクションは自動的に終了します。また,一部の文書空間にアクセスするメソッドが失敗した場合も,強制的にロールバック処理が実行されて,トランザクションが終了することがあります。

(2) トランザクションの範囲

トランザクション範囲を指定する処理の例を次に示します。

なお,この例は,トランザクションの範囲について理解するための例ですので,処理自体に意味はありません。

// トランザクション範囲を指定する例
 
 // sess:DbjSessionインターフェース
 
// セッションを確立する(ログイン)
DbjDocSpace docspc = sess.login( username, passwd );
try {
 // DbjDocSpaceインターフェースからDbjObjインターフェースを取得する
 DbjObj obj = docspc.createObjConnection(oiid);
 
 // Nameプロパティを取得する準備をする
 Set propdef = new HashSet();
 propdef.add( "Name" );
 
 // メソッド単位のトランザクションの例
 // 文書空間オブジェクトからNameプロパティを取得
 // メソッドの実行によって,暗黙的にトランザクションが開始・終了される
 obj.readProperties( propdef );

 // 明示的にトランザクションを開始・終了する例
 // 明示的にトランザクションを開始する--------------------------
 sess.begin();

 // 文書空間オブジェクトのWRITEロックを取得して
 // Nameプロパティを取得する
 // トランザクションはメソッド終了後も継続される
 obj.lock(DbjDef.LOCK_WRITE).readProperties();

 // 文書空間オブジェクトにNameプロパティを更新する
 // トランザクションはメソッド終了後も継続される
 obj.writeProperties();

 // 明示的にトランザクションを終了する---------------------------
 sess.commit();

} catch(Exception e) {

 // 処理中にエラーが発生した場合は,
 // トランザクション中の処理を取り消して
 // トランザクションを終了する------------------------------------
 sess.rollback();
}

// セッションを切断する(ログアウト)
sess.logout();

なお,DbjSession#beginメソッドによって明示的にトランザクションを開始した場合は,DbjSession#commitメソッドまたはDbjSession#rollbackメソッドによって明示的にトランザクションを終了するまで,再度DbjSession#beginメソッドを実行することはできません。一つのセッション内で明示的に開始できるトランザクションは一つだけです。