<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    大鳥的學習樂園
    路漫漫其修遠兮,吾將上下而求索
    posts - 26,comments - 27,trackbacks - 0
    在WebLogic 7/8/9中,對TransactionManager的引用可以通過在Weblogic 7的TxHelper中定義的靜態方法getTransactionManager()而獲得。該類在WebLogic 8中被否決了,而用TransactionHelper取而代之。

    public TransactionManager getFromWebLogicFactory()
    throws Exception {
    try {
    // WebLogic 8/9
    return
    weblogic.transaction.TransactionHelper
    .getTransactionManager();
    }
    catch (ClassNotFoundException ex) {}

    try {
    // WebLogic 7
    return
    weblogic.transaction.TxHelper
    .getTransactionManager();
    }
    catch (ClassNotFoundException ex) {}

    return null;
    }


    使用TransactionManager

      一旦成功地獲得TransactionManager引用,就可以用它來掛起和恢復事務,正如以下的示例代碼所示。

    // obtain UserTransaction object and start transaction
    InitialContext ctx = new InitialContext();
    UserTransaction userTransaction = (UserTransaction)
    ctx.lookup("java:comp/UserTransaction");

    // start first transaction
    userTransaction.begin();

    // obtain TransactionManager
    // using one of the methods described above
    TransactionManager tm = getTransactionManager();

    // suspend transaction
    // suspend() returns reference to suspended
    // Transaction object which later should be passed
    // to resume()
    Transaction transaction = tm.suspend();

    // here you can do something outside of transaction
    // or start new transaction,
    // do something and then commit or rollback
    userTransaction.begin();

    // commit subtransaction
    userTransaction.commit();

    // resume suspended transaction
    tm.resume(transaction);

    // commit first transaction
    userTransaction.commit();
    ...



    正如您所看到的,在TransactionManager接口的幫助下,可以對UserTransaction所提供的標準功能進行擴展,在BMT代碼中實現與CMT bean相同的靈活性水平。

      需要知道的是,當事務被掛起時,并不意味著事務的計時器停止了。換言之,如果把事務的超時設定為30秒,而事務已掛起了20秒并恢復了,那么該事務只剩10秒就要到達超時了。事務的掛起會解除事務與正在運行的線程之間的關聯,然后resume()調用會再次將其關連,而不影響事務超時計時器。

      已知問題

      因為J2EE規范并不要求TransactionManager在J2EE容器中的可用性以及功能(雖然從底層的JTA基礎架構中我們知道它應該是存在的),所以有些應用服務器中存在一些問題。例如,在WebLogic 7、8以及9(beta版)中有種特別奇怪的現象:假如一個事務被標記為回滾(通過調用UserTransaction.setRollbackOnly()),然后被掛起,當被掛起的事務嘗試恢復時,它將會出現如下的提示:
    javax.transaction.InvalidTransactionException: Attempt to resume an inactive transaction

    以下代碼說明了該行為:

    // obtain UserTransaction object and start transaction
    InitialContext ctx = new InitialContext();
    UserTransaction userTransaction = (UserTransaction)
    ctx.lookup("java:comp/UserTransaction");
    userTransaction.begin();

    // mark for rollback
    userTransaction.setRollbackOnly();

    TransactionManager tm = getTransactionManager();

    // suspend transaction
    Transaction transaction = tm.suspend();

    // resume suspended transaction
    // this call will fail with InvalidTransactionException
    // in WebLogic
    tm.resume(transaction);
    ...


    幸運的是,對于該問題,有一個應急方案。WebLogic的TransactionManager實現連同標準的resume(Transaction transaction)方法,有一個可用于替代的forceResume方法。以下的代碼展示了一種在WebLogic中運行代碼時需要用到的模式。注意,在這種情況下,應該把對TransactionManager的引用轉換到WebLogic的定制實現接口(WebLogic 7中的weblogic.transaction.TransactionManager或WebLogic 8以及更高版本中的weblogic.transaction.ClientTransactionManager)。

    ...
    // obtain UserTransaction object and start transaction
    InitialContext ctx = new InitialContext();
    UserTransaction userTransaction = (UserTransaction)
    ctx.lookup("java:comp/UserTransaction");
    userTransaction.begin();

    // mark for rollback
    userTransaction.setRollbackOnly();

    TransactionManager tm = getTransactionManager();

    // suspend transaction
    Transaction transaction = tm.suspend();

    // resume suspended transaction
    try ...{
    // first try standard JTA call
    tm.resume(transaction);
    }
    catch (InvalidTransactionException e) ...{
    // standard method failed, try forceResume()
    if (tm instanceof
    weblogic.transaction.ClientTransactionManager) ...{
    // WebLogic 8 and above
    ((weblogic.transaction.ClientTransactionManager)tm)
    .forceResume(transaction);
    }
    else if (tm instanceof
    weblogic.transaction.TransactionManager) ...{
    // WebLogic 7
    ((weblogic.transaction.TransactionManager)tm)
    .forceResume(transaction)
    }
    else ...{
    // cannot resume
    throw e;
    }
    }
    ...


    TransactionManager在Spring Framework中的用法

      在流行的Spring framework中,以上所描述的技術都被廣泛地用于事務代理。應該注意的是,每次使用PROPAGATION_REQUIRES_NEW或PROPAGATION_NOT_SUPPORTED、事務屬性以及JtaTransactionManager來配置Spring的TransactionProxyFactoryBean時,Spring就會用JTA的TransactionManager來掛起和恢復事務。Spring太智能了,但有時太智能了反而使我無法接受——甚至沒有指定,它就會發現容器中的TransactionManager。例如,當在一個Spring應用程序上下文中定義JtaTransactionManager時,就可以為UserTransaction提供一個JNDI名,而如果UserTransaction也實現了它,它就將“自動檢測”TransactionManager。如上所示,這對WebLogic、Orion和Oracle OC4J都適用。

      有時,這可能并不是我們所想要的,尤其是當您想要嚴格遵循J2EE/EJB規范,并確??缢蠮2EE容器的完全可移植性的時候。正如我們所看到的,有時候編程式的事務掛起和恢復可能存在一些問題。雖然Spring知道如何繞過這些問題,至少是對于上面所描述的問題,即,在Welogic中,在掛起之前將事務標記為回滾。在這種情況下,可以在配置JtaTransactionManager時把autodetectTransactionManager屬性設定為false。如果這么做了,那么任何使用PROPAGATION_REQUIRES_NEW或PROPAGATION_NOT_SUPPORTED事務屬性的嘗試都會拋出TransactionSuspensionNotSupportedException而失敗。但PROPAGATIO-REQUIRED、PROPAGATION-SUPPORTS、PROPAGATION-MANDATORY以及PROPAGATION-NEVER應該會正常運行。這對應于JTA Usertransaction所提供的功能,而且在任一個兼容J2EE的容器中都起作用。

      以下是Spring應用程序上下文中的事務管理器定義,其中禁用了TransactionManager自動檢測:

    <bean id="transactionManager" class=
    "org.springframework.transaction.jta.JtaTransactionManager">
    <property name="userTransactionName">
    <value>javax.transaction.UserTransaction</value>
    </property>
    <property name="autodetectTransactionManager">
    <value>false</value>
    </property>
    </bean>

    結束語

      J2EE規范不要求對JIA TransactionManager接口的支持。但由于J2EE使用JTA作為它的底層事務基礎架構,所以幾乎所有的J2EE服務器都把它公開為J2EE的擴展。存在一些已知的兼容性問題,而在某些情況下,可以用特定于容器的代碼來繞過這些問題。但是,如果需要實現編程式事務掛起,則J2EE中的TransactionManager是一個強大的特性。只需首先在所選擇的J2EE服務器中檢測一下它是否可用就可以了。

    posted on 2008-11-26 19:28 大鳥 閱讀(442) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲男人的天堂www| 亚洲国产专区一区| 国产无人区码卡二卡三卡免费| h视频在线免费看| 午夜免费不卡毛片完整版| 国产精品免费看香蕉| www国产亚洲精品久久久| 亚洲精品人成在线观看| 亚洲一卡2卡4卡5卡6卡残暴在线| 亚洲aⅴ天堂av天堂无码麻豆| jizz在线免费播放| 免费AA片少妇人AA片直播| 亚洲人成片在线观看| 中文字幕免费在线观看动作大片| 亚洲精品视频免费看| 免费一级毛片清高播放| 久久精品国产亚洲AV久| 日本高清免费aaaaa大片视频| 亚洲欧洲国产精品香蕉网| 日本三级在线观看免费| 国产美女无遮挡免费网站| 一二三四在线观看免费中文在线观看| 亚洲人成在线免费观看| 中文字幕在线观看亚洲日韩| 亚在线观看免费视频入口| 免费永久在线观看黄网站| 亚洲国产乱码最新视频| 免费一级一片一毛片| 免费精品久久天干天干| 学生妹亚洲一区二区| 亚洲女同成人AⅤ人片在线观看| 无码AV片在线观看免费| 亚洲国产精品无码久久九九大片 | 久久精品国产亚洲5555| 亚洲Av永久无码精品黑人| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲一区爱区精品无码| 又黄又爽又成人免费视频| 九九九精品视频免费| 亚洲国产婷婷综合在线精品| 99精品视频在线视频免费观看|