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

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

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

    spring本地事務與JTA事務實現解析

    Posted on 2005-10-22 22:57 publisher luo 閱讀(10179) 評論(2)  編輯  收藏 所屬分類: 項目問題解決

          大家都知道spring支持兩種事務,一種是本地連接事務(使用DataSourceTransactionManager),一種是JTA事務(使用JtaTransactionManager)。并且支持聲明式事務和編程式事務兩種方式。采用聲明式事務使用AOP方式的TransactionProxyFactoryBean代理工廠類。
          JTA事務實現相對較好理解,在執行實際類的符合模式的方法時,代理類通過在連接點前后插入預處理過程(開始事務)和后處理過程(commit或rollbak)即可。因為JTA事務支持兩階段提交所以在代碼中啟動多少個連接(不同的connection)都能保證事務最終提交或者回滾。可是本地連接事務是如何實現的呢?因為必須后面的dao層必須使用的同一個連接才能保證事務正常提交和回滾,在業務邏輯層可以調用dao層的多個類的多個方法,每個方法如果顯式的將connection做為參數傳入到還可以,但是這樣connection就要出現調用的在業務邏輯層,而且dao的每個方法還要有個connection參數比較難看,而且開發人員要關注事務,這樣就沒有達到開發人員只要關注業務邏輯即可的要求。 
          web應用,各個類都要在多線程環境下運行,所以每個方法要保證線程安全,這樣,不在dao方法中加參數而是在dao類中加入connection屬性也就不可取了,怎么辦?查看一下JdbcTemplate類,在執行每個方法需要數據庫連接時都使用了DataSourceUtils.getConnection(getDataSource())方法?難道每回都從數據源里面取一條連接?不可能,這樣事務肯定沒法實現,可是怎么能保證取的是一條連接呢?對了是不是采用本地線程呀(TreadLocal),因為一段事務都是在一個線程中完成,所以只要在事務開始的時候將connection存放在本地線程中,然后事務過程中從本地線程中取出connection,直到事務結束即可。不錯,這樣只需要在每個dao方法的取數據庫連接的方法中有個事務狀態的判斷即可。不錯看看spring是不是這樣實現的?果然如此,DataSourceUtils.getConnection(DataSource)方法調用doGetConnection()方法,方法內容如下:
    public static Connection doGetConnection(DataSource dataSource) throws SQLException {
      Assert.notNull(dataSource, "No DataSource specified");

      ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
      if (conHolder != null) {
       conHolder.requested();
       return conHolder.getConnection();
      }

      logger.debug("Fetching JDBC Connection from DataSource");
      Connection con = dataSource.getConnection();

      if (TransactionSynchronizationManager.isSynchronizationActive()) {
       logger.debug("Registering transaction synchronization for JDBC Connection");
       // Use same Connection for further JDBC actions within the transaction.
       // Thread-bound object will get removed by synchronization at transaction completion.
       conHolder = new ConnectionHolder(con);
       conHolder.setSynchronizedWithTransaction(true);
       conHolder.requested();
       TransactionSynchronizationManager.registerSynchronization(
         new ConnectionSynchronization(conHolder, dataSource));
       TransactionSynchronizationManager.bindResource(dataSource, conHolder);
      }

      return con;
     }
    conHolder?TransactionSynchronizationManager?很象呀,繼續看看TransactionSynchronizationManager類果真如此,里面使用TreadLocal來保存數據連接和事務狀態。原來如此,代碼里的各個層沒有特殊需要都不用再出現事務了,程序開發人員只要關注業務就可以了,不用再勞心編寫事務代碼了。

    Feedback

    # re: spring本地事務與JTA事務實現解析  回復  更多評論   

    2005-12-08 08:47 by seagoer
    不錯,我也一致疑惑 對于本地事務,難道spring實現了自己的jta,dao層每個方法都獨自獲得連接來處理,看起來好像確實是使用本地線程來處理的。

    # re: spring本地事務與JTA事務實現解析  回復  更多評論   

    2006-01-11 14:17 by barry
    呵呵。我也剛剛想到這個問題。
    查看了一下spring doc。
    如果在代碼中直接使用了DataSource.getConnetction()的方式(比如遺留代碼),還可以通過設置一個TransactionAwareDataSourceProxy來代理DataSource。

    posts - 9, comments - 27, trackbacks - 0, articles - 19

    Copyright © publisher luo

    主站蜘蛛池模板: 亚洲va久久久噜噜噜久久| 亚欧洲精品在线视频免费观看 | 亚洲视频在线观看| 又爽又黄无遮挡高清免费视频 | 亚洲成在人线av| 四虎永久成人免费影院域名| 2015日韩永久免费视频播放| 国产免费伦精品一区二区三区| 亚洲精品无码不卡在线播放| 亚洲精品美女在线观看播放| 亚洲色成人中文字幕网站| 日韩免费一区二区三区| 免费国产成人高清在线观看网站| 免费毛片在线看不用播放器| 猫咪免费人成在线网站 | 国产成人精品男人免费| 国国内清清草原免费视频99 | 亚洲国产精品自在线一区二区| 亚洲Av无码乱码在线znlu| 女人毛片a级大学毛片免费| 又大又硬又爽又粗又快的视频免费| 最近国语视频在线观看免费播放| 黄网站在线播放视频免费观看 | 四虎影院免费在线播放| 日本阿v免费费视频完整版| 91福利免费视频| 免费无码中文字幕A级毛片| a在线免费观看视频| 热久久这里是精品6免费观看| 日韩毛片免费一二三| 老司机福利在线免费观看| 特级毛片全部免费播放a一级| 春暖花开亚洲性无区一区二区| 亚洲国产AV无码一区二区三区| 亚洲日韩精品国产一区二区三区 | 歪歪漫画在线观看官网免费阅读| 波多野结衣免费在线| 青青青国产在线观看免费| 在线观看免费高清视频| 最近免费中文字幕视频高清在线看 | 亚洲黄色免费观看|