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

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

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

    yxhxj2006

    常用鏈接

    統(tǒng)計

    最新評論

    最簡單的Java處理事務(wù)

    用一個簡單的例子來說明Java處理事務(wù):
    我們用銀行轉(zhuǎn)賬的時候可以簡單的看成是兩步操作--將錢從A賬戶轉(zhuǎn)出和將錢轉(zhuǎn)到B賬戶。問題來了,如果我從A賬戶轉(zhuǎn)出之后,突然無法連接數(shù)據(jù)庫了,這樣錢就不能轉(zhuǎn)到B賬戶了,可是A的錢已經(jīng)沒了。所以我們應(yīng)該把這兩步看成是一個整體,要么同時成功,要么什么都不做。這就是事務(wù)了。
     
    Java中是如何處理事務(wù)的呢?
    我們從java.sql.Connection說起,Connection表示了一個和數(shù)據(jù)庫的鏈接,可以通過Connection來對數(shù)據(jù)庫操作。在通常情況是Connection的屬性是自動提交的,也就是說每次的操作真的更新了數(shù)據(jù)庫,真的無法回退了。針對上述的例子,一旦A賬戶的錢轉(zhuǎn)出了,即對數(shù)據(jù)庫進(jìn)行了更新操作了,但是錢并沒有轉(zhuǎn)到B的賬戶,這筆錢就白白“不見”了。這并不是我們希望的。 
        我們希望的是:看起來成功了,但是沒有真的操作數(shù)據(jù)庫,知道我想讓他真的發(fā)生。可以通過Connection的setAutoCommit(false)讓Connection不自動提交你的數(shù)據(jù),除非你真的想提交。那么如何讓操作真的發(fā)生呢?可以使用Connection的commit方法。如何讓操作回退呢?使用rollback方法。
    例如: 
      try{ 
      Connection conn = getConnection(); // 不管如何我們得到了鏈接 
      conn.setAutoCommit(false); 
      // A賬戶轉(zhuǎn)出
      // B賬戶轉(zhuǎn)入
      conn.commit(); // 成功的情況下,提交更新。 
      } catch(SQLException ex) { 
      conn.rollback(); // 失敗的情況下,回滾所有的操作 
      } finally { 
      conn.close();
      } 
        這里有一點非常重要,事務(wù)是基于數(shù)據(jù)庫鏈接的。所以在但數(shù)據(jù)庫的情況下,事務(wù)操作很簡單。 
      那么如果表分布在兩個不同的數(shù)據(jù)庫中呢? 
      例如訂單表在訂單庫中,庫存表在庫存庫中,那么我們?nèi)绾翁幚磉@樣的事務(wù)呢? 
      需要注意,提交也可以遇到錯誤呀! 
      try{ 
      Connection conn1 = getConnection1(); 
      Connection conn2 = getConnection2(); 
      // 基于conn1做更新操作 
      // 基于conn2做更新操作 
      try{ 
      conn1.commit() 
      } catch(SQLExcetion ) { 
      conn1.rollback(); 
      } 
      try { 
      conn2.commit(); 
      } catch(SQLException ) { 
      conn2.rollbakc(); 
      // 保證務(wù)必將剛才的更新還原回來。 
      } 
      } catch(SQLException ex) { 
      // 如果更新失敗,conn1.rollback 
      // 如果更新失敗,conn1.rollback && conn2.rollback 
      } finally { 
      conn1.close(); 
      conn2.close(); 
      } 
      看看上述的代碼就知道,其實操作非常的復(fù)雜,甚至:保證肯定還原剛才更新的賬戶根本無法保證。
    在上述情況下的事務(wù)可以稱之為分布式事務(wù),通過上述的代碼中事務(wù)同時提交處理的部分我們可以得出,要想處理分布式事務(wù),必須有獨立于數(shù)據(jù)庫的第三方的事務(wù)處理組件。 
      幸運的是通常情況下,JavaEE兼容的應(yīng)用服務(wù)器,例如:Weblogic,Websphere,JBoss,Glassfish等都有這種分布式事務(wù)處理的組件。 

    如何使用應(yīng)用服務(wù)器的分布式事務(wù)管理器處理分布式事務(wù)? 
      以galssfish為例 
      1 建立對應(yīng)兩個數(shù)據(jù)庫的XA(javax.sql.XADataSource)類型的數(shù)據(jù)源。 
      2 使用UserTransaction來保證分布式事務(wù)。 
      try{ 
      Connection conn1 = datasource1.getConnection(); 
      Connection conn2 = datasource2.getConnection(); 
      UserTransaction ut = getUserTransaction(); 
      ut.begin(); 
      // A賬戶轉(zhuǎn)出
      // B賬戶轉(zhuǎn)入
      ut.commit(); // 成功的情況下,提交更新。 
      } catch(SQLException ex) { 
      ut.rollback(); // 失敗的情況下,回滾所有的操作 
      } finally { 
      conn.close(); 
      } 
      如何獲取UserTransaction呢?可以使用如下方法 
      UserTransaction tx = (UserTransaction) ctx.lookup("jndi/UserTransaction"); 

    posted on 2012-07-19 15:35 奮斗成就男人 閱讀(186) 評論(0)  編輯  收藏


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 四虎永久在线精品免费网址| 国产99视频精品免费观看7| 亚洲综合伊人久久综合| 亚洲精品无码久久久久去q| 久久精品国产亚洲av高清漫画| 亚洲国产成人精品91久久久| 久久精品国产亚洲沈樵| 亚洲小说图片视频| 人人鲁免费播放视频人人香蕉| 日本免费一区二区久久人人澡| 国产a视频精品免费观看| 亚洲精品中文字幕麻豆| 香蕉国产在线观看免费| 亚洲日韩中文字幕日韩在线| eeuss影院ss奇兵免费com| 亚洲中文字幕久久精品无码APP | 国产yw855.c免费视频| 深夜福利在线免费观看| 亚洲JIZZJIZZ中国少妇中文| 日日狠狠久久偷偷色综合免费| 亚洲欧洲免费无码| 亚洲高清一区二区三区| 国产一区二区三区在线观看免费| 亚洲成AV人综合在线观看| 免费高清在线影片一区| 中国china体内裑精亚洲日本| 青娱乐在线免费观看视频| 亚洲免费电影网站| 亚洲国产精品综合久久久| 99精品国产免费久久久久久下载| 亚洲国产精品一区二区成人片国内| 亚洲欧美日韩综合久久久久| 外国成人网在线观看免费视频| 精品久久免费视频| 亚洲阿v天堂在线2017免费 | ASS亚洲熟妇毛茸茸PICS| 久久免费福利视频| 日本亚洲精品色婷婷在线影院| 国产精品99久久免费观看| 亚洲人色大成年网站在线观看| 色欲色香天天天综合网站免费|