靈魂-放水

          為學日益,為道日損。

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            296 Posts :: 10 Stories :: 274 Comments :: 0 Trackbacks
          ?Transaction不管在J2EE還是.NET領域中都是相當重要的一個組成部分。盡管很多與Transaction相關的概念在兩個不同的平臺中都是相通的,但是它們在Transaction的實現方面卻有著很多的不同。想對.NET下的Transaction有更深入了解的朋友,可以參考 idior 兄寫Transaction in ADO.net 2.0。在以下的篇幅里面,我就J2EE中與Transaction相關的幾個概念做些講述。
          ??????? 1.什么是Transaction?所謂Transaction是指一系列不可分割的改動數據庫的操作。在這個解釋中,有三個關鍵詞:一系列不可分割以及改動。僅僅是一個改動數據庫的操作是沒有Transaction可言,只有“一系列”操作(一組SQL語句)才可能組成Transaction;“不可分割”就意味著一致性和完整性,要么這一系列操作全部commit,要么就全部rollback;如果一系列的操作只包含enquiry操作,那么這些操作也不是Transaction。?
          ????????2.在J2EE中,Transaction主要有幾大類,具體有幾種?在J2EE中,Transaction主要有Bean-Managed Transaction和Container-Managed Transaction兩大類。其中在Bean-Managed Transaction中還會分為JDBC Transaction和JTA Transaction兩種。
          ????????3.什么是JDBC Transaction?它有怎樣的特點?JDBC Transaction是指由Database本身去管理的事務。其最大的特點就是通過顯示調用Connection接口的commit和rollback方法來完成事務的提交和回滾。事務結束的邊界是commit或者rollback方法的調用,而開始的邊界則不是那么明顯了,它會開始于組成當前事務的所有statement中的第一個被執(zhí)行的時候。具體代碼如下:
          class ?CreditDAoImpl?implements?CreditDAO? {
          ????Connection?conn?
          =
          ?getConnection();
          ????
          public ? void ?transfer(Currency?amount,?Account?fromAccount,?Account?toAccount)?throws?CreditException?
          {
          ????????
          try ?
          {
          ?????????????conn.setAutoCommit(
          false
          );
          ?????????????depositToAccount(conn,?toAccount,?amount);
          ?????????????withdrawFromAccount(conn,?fromAccount,?amount);?????
          ?????????????conn.commit();
          ????????}
          ? catch ?(Exception?e)? {
          ????????????
          try ?
          {
          ?????????????????conn.rollback();
          ?????????????????
          throw ? new
          ?CreditException(e.getMessage());
          ????????????}
          ? catch ?(SQLException?e1)? {
          ?????????????????
          throw ? new
          ?CreditException(e.getMessage());
          ????????????}
          ???????????????????????
          ????????}
          ?
          ????}

          }

          ??????? 4.什么是JTA Transaction?它有怎樣的特點呢?JTA Transaction是指由J2EE Transaction manager去管理的事務。其最大的特點是調用UserTransaction接口的begin,commit和rollback方法來完成事務范圍的界定,事務的提交和回滾。JTA Transaction可以實現同一事務對應不同的數據庫,但是它仍然無法實現事務的嵌套。具體的代碼如下[1]

          public ? void ?withdrawCash( double ?amount)? {
          ???UserTransaction?ut?
          =
          ?context.getUserTransaction();
          ???
          try ?
          {
          ??????ut.begin();
          ??????updateChecking(amount);
          ??????machineBalance?
          -=
          ?amount;
          ??????insertMachine(machineBalance);
          ??????ut.commit();
          ???}
          ? catch ?(Exception?ex)? {
          ???????
          try ?
          {
          ??????????ut.rollback();
          ???????}
          ? catch ?(SystemException?syex)?
          {
          ???????????
          throw ? new
          ?EJBException
          ??????????????(
          " Rollback?failed:? " ? +
          ?syex.getMessage());
          ???????}

          ???????
          throw ? new ?EJBException?
          ??????????(
          " Transaction?failed:? " ? +
          ?ex.getMessage());
          ????}

          }

          ??????? 5.什么是Container-Managed Transaction?它又有怎樣的特點呢?Container-Managed Transaction,顧名思義,就是由Container負責管理的Transaction,當然這樣Transaction是出現在EJB的范疇中。Container-Managed Transaction最大的特點是不需要顯式界定事務的邊界,也不需要顯式的提交或者回滾事務,這一切都由Container來替我們完成。我們需要做的就是設定在一個Bean中,哪些方法是跟事務相關的,同時設定它們的Transaction Attribute既可。
          ??????? Transaction的Scope是相當重要的,特別是在一個Bean的方法中調用另外一個Bean的方法。為了便于說明問題,我們把這兩個方法分別稱為methodA和methodB。當methodA調用methodB的時候,methodB在事務的層面上對調用者methodA有怎樣的限制(methodB中是否存在事務)以及methodA如何在事務的層面上實現對methodB的調用(是否需要重新創(chuàng)建一個新的事務來處理methodB的調用)都需要通過Transaction Attribute來設定的。具體的Transaction Attribute有以下六種:Required,RequiresNew,Mandatory,NotSupported,Supports和Never。有關Transaction Attribute的介紹,可以參閱J2EE Tutorial中關于Container-Managed Transaction的介紹

          ??????? [1] 代碼來自SUN的J2EE Tutorial中關于Bean-Managed Transaction的介紹

          posted on 2006-10-30 16:23 放水老倌 閱讀(376) 評論(0)  編輯  收藏 所屬分類: J2EE
          主站蜘蛛池模板: 富阳市| 汽车| 阿尔山市| 鄯善县| 沂源县| 榕江县| 新竹县| 类乌齐县| 巴塘县| 宽甸| 正安县| 临沭县| 靖宇县| 肃北| 瑞金市| 古浪县| 阜阳市| 德昌县| 三江| 万年县| 南充市| 定结县| 永新县| 青川县| 子长县| 衡水市| 鹤岗市| 封开县| 绵竹市| 湛江市| 万山特区| 定日县| 五寨县| 阿瓦提县| 福贡县| 方山县| 平山县| 木里| 岗巴县| 黔西县| 绩溪县|