import javax.ejb.SessionContext; import javax.transaction.UserTransaction; import javax.naming.InitialContext; import javax.sql.DataSource; import java.sql.Connection; InitialContext ic = new InitialContext(); UserTransaction utx = (UserTransaction)ic.lookup("java:comp/UserTransaction"); DataSource ds = (DataSource)ic.lookup("DB/sample"); UserTransaction utx = ctx.getUserTransaction(); // 以下、トランザクション処理 utx.begin(); try { // 業務処理 Connection con = ds.getConnection(); // コネクション(con)を利用したデータベース更新をここで行なう con.close(); utx.commit(); } catch (Exception e) { // 例外処理 if (con != null) con.close(); utx.rollback(); }
// セッションBeanのsetSessionContextメソッド内で渡されたSessionContextを // フィールド変数(sessionContext)として保持しておく SessionContext ctx = sessionContext; UserTransaction utx = ctx.getUserTransaction();
この場合、トランザクション開始前にJDBCコネクションを取得したり、トランザクション完了後にJDBCコネクションをクローズすることができます。
InitialContext ic = new InitialContext(); UserTransaction utx = (UserTransaction)ic.lookup("java:comp/UserTransaction");
EJBアプリケーションに限り、トランザクション開始前にJDBCコネクションを取得したり、トランザクション完了後にJDBCコネクションをクローズすることができます。
InitialContext ic = new InitialContext(); UserTransaction utx = (UserTransaction)ic.lookup("UserTransaction");
この場合、トランザクション開始前にJDBCコネクションを取得したり、トランザクション完了後にJDBCコネクションをクローズすることはできません。
utx.begin();
DataSource ds = (DataSource)ic.lookup("DB/sample"); Connection con = ds.getConnection(); // コネクション(con)を利用したデータベース更新をここで行なう con.close();
Memo
データベースのアクセス方法の詳細については、
[ アプリケーション開発ガイド(共通)
> 3. JDBCアプリケーションの開発 ]
を参照してください。
try { // 業務処理 utx.commit(); } catch (Exception e) { // 例外処理 utx.rollback(); }トランザクションの基本的な流れについては以上です。以下ではその他のUserTransactionインタフェースのメソッドについて説明します。
utx.setTransactionTimeout(30); utx.begin(); try { // 業務処理 // 30秒以内に業務処理が終わらない場合自動的にロールバックする
try { // 業務処理 } catch (Exception e) { // 例外処理 utx.setRollbackOnly(); } utx.commit();
int status = utx.getStatus();返却される値とその意味は次の通りです。
状態(値) | 意味 |
---|---|
STATUS_ACTIVE(0) | トランザクション開始後のアクティブな状態 |
STATUS_COMMITTED(3) | コミットが完了した状態 |
STATUS_COMMITTING(8) | トランザクションのコミット処理中 |
STATUS_MARKED_ROLLBACK(1) | ロールバック用にマークされた状態 (setRollbackOnly()の結果として) |
STATUS_NO_TRANSACTION(6) | トランザクションが開始されていない状態 |
STATUS_PREPARED(2) | プリペアが完了した状態 |
STATUS_PREPARING(7) | プリペアの処理中 |
STATUS_ROLLEDBACK(4) | トランザクションの結果がロールバックと決定された状態 |
STATUS_ROLLING_BACK(9) | ロールバック処理中 |
STATUS_UNKNOWN(5) | トランザクションの結果が不明な状態 |