一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

J2EE中的事務(wù)處理 - 成功解決事務(wù)嵌套

 duduwolf 2005-09-29

JTA事務(wù)的嵌套

  由于前兩篇帖子都是關(guān)于事務(wù)的討論 (J2EE中的事務(wù)處理 、 事務(wù)服務(wù)淺析),沒有討論到事務(wù)嵌套時(shí)的解決辦法,這兩天一直在琢磨,如何才能高效、靈活的解決事務(wù)的嵌套問題呢?
  既然web容器可以判斷當(dāng)前方法是否處在事務(wù)中(JTA事務(wù)中提交java.sql.Connection.commit()會(huì)報(bào)錯(cuò)),那么它是如何判斷的呢?帶著這個(gè)疑問,追查了一下resin容器源碼的事務(wù)部分,發(fā)現(xiàn)了一個(gè)類:javax.transaction.Status,用來標(biāo)明事務(wù)狀態(tài)代碼,而javax.transaction.UserTransaction.getStatus()可以取得事務(wù)當(dāng)前的狀態(tài)!
  這樣的話,就比較簡單了。既然可以隨時(shí)取得事務(wù)的狀態(tài)編碼,而且又能清楚知道每個(gè)狀態(tài)碼的含義,就可以對(duì)事務(wù)進(jìn)行再次封裝了

我的解決辦法

package com.javer.test;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.transaction.Status;
import javax.transaction.UserTransaction;

/**
 
* 事務(wù)管理器,對(duì)事務(wù)再次進(jìn)行封裝
 
* <p>@author javer QQ:84831612</p>
 
* @date 2005
 
*/
public class TransactionManager {

 
private UserTransaction tx = null;

 
/**
  
* 是否自己管理事務(wù)(true:自己提交、回滾事務(wù);false:當(dāng)前事務(wù)是嵌套事務(wù),自己不進(jìn)行事務(wù)管理)
  
*/
 
private boolean transactionBySelf = true;

 
private TransactionManager(){}

 
public static TransactionManager getInstance() throws Exception {
   
Context ic = new InitialContext();
    UserTransaction _tx = (UserTransaction) ic.lookup("java:comp/UserTransaction"); //resin服務(wù)器中取得UserTransaction

    TransactionManager tm = new TransactionManager();
    tm.tx = _tx;
    if(_tx.getStatus() != Status.STATUS_NO_TRANSACTION)
    tm.transactionBySelf = false;

   
return tm;
 
}

 
public void beginTransaction() throws Exception {
   
if (tx == null)
   
return;
    if(tx.getStatus() != Status.STATUS_NO_TRANSACTION)
      transactionBySelf = false;

   
if (transactionBySelf) {
      tx.begin();
      //
System.out.println("TransactionManager:打開事務(wù)!");
   
}//else {
     
//System.out.println("TransactionManager:已經(jīng)處于事務(wù)中了!所以沒有再次打開事務(wù)!");
    //
}
 
}

 
public void commitTransaction() throws Exception {
   
if (tx == null)
     
return;
   
if (transactionBySelf) {
      tx.commit();
     
//System.out.println("TransactionManager:提交事務(wù)!");
   
}// else {
     
//System.out.println("TransactionManager:已經(jīng)處于事務(wù)中了!所以沒有提前提交事務(wù)!");
    //
}
 
}

 
public void rollbackTransaction() throws Exception {
   
if (tx == null)
     
return;
   
if (transactionBySelf) {
      tx.rollback();
     
//System.out.println("TransactionManager:回滾事務(wù)!");
   
}// else {
     
//System.out.println("TransactionManager:已經(jīng)處于事務(wù)中了!所以沒有提前回滾事務(wù)!");
    //
}
 
}
}

調(diào)用示例

方法a
void a() throws Exception {
  TransactionManager tm = TransactionManager.getInstance();
  try{
    tm.beginTransaction();

    System.out.println("JaverTest:數(shù)據(jù)庫操作!");

    b(); //調(diào)用方法b

    tm.commitTransaction();
  }catch(Exception e){
    tm.rollbackTransaction();
    throw e;
  }
}

方法b
void b() throws Exception {
  TransactionManager tm = TransactionManager.getInstance();
  try{
    tm.beginTransaction();

    System.out.println("JaverTest:數(shù)據(jù)庫操作!");

    tm.commitTransaction();
  }catch(Exception e){
    tm.rollbackTransaction();
    throw e;
  }
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产一级内片内射免费看| 国产精品一区欧美二区| 91后入中出内射在线| 香蕉网尹人综合在线观看| 好吊一区二区三区在线看| 久热香蕉精品视频在线播放| 中国一区二区三区人妻| 日韩蜜桃一区二区三区| 精品久久少妇激情视频| 国产内射在线激情一区| 亚洲熟女诱惑一区二区| 黄片在线观看一区二区三区| 激情亚洲一区国产精品久久| 色无极东京热男人的天堂| 欧美成人一区二区三区在线 | 女同伦理国产精品久久久| 国产精欧美一区二区三区久久| 国产美女精品人人做人人爽| 亚洲午夜福利视频在线| 中文字幕一区久久综合| 免费特黄欧美亚洲黄片| 日本特黄特色大片免费观看| 99国产成人免费一区二区| 欧美午夜色视频国产精品| 亚洲精品蜜桃在线观看| 午夜小视频成人免费看| 午夜亚洲少妇福利诱惑| 日本三区不卡高清更新二区| 国产精品免费视频专区| 精品一区二区三区免费看| 大胆裸体写真一区二区| 久久综合亚洲精品蜜桃| 日韩精品第一区二区三区| 欧美精品亚洲精品日韩精品| 国产精品亚洲综合天堂夜夜| 嫩呦国产一区二区三区av| 国产精品一区二区视频成人| 日韩毛片视频免费观看| 欧美精品亚洲精品日韩专区| 日本欧美一区二区三区高清| 欧美精品二区中文乱码字幕高清|