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

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

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

    如鵬網 大學生計算機學習社區

    CowNew開源團隊

    http://www.cownew.com 郵件請聯系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

    Spring 事務管理創造性的解決了很多以前要用重量級的應用服務器才能解決的事務問題,那么其實現原理一定很深奧吧?可是如果讀者仔細研究了Spring事務管理的代碼以后就會發現,事務管理其實也是如此簡單的事情。這也印證了在本書開頭的一句話“重劍無鋒、大巧不工”,Spring并沒有使用什么特殊的API,它運行的原理就是事務的原理。下面是DataSourceTransactionManager的啟動事務用的代碼(經簡化):
    protected void doBegin(Object transaction, TransactionDefinition definition)
    {
    ?DataSourceTransactionObject txObject =
    (DataSourceTransactionObject) transaction;
    ?Connection con = null;
    ?try
    ?{
    ??if (txObject.getConnectionHolder() == null)
    ??{
    ???Connection newCon = this.dataSource.getConnection();
    ???txObject.setConnectionHolder(
    new ConnectionHolder(newCon), true);
    ??}
    ??txObject.getConnectionHolder()
    .setSynchronizedWithTransaction(true);
    ??con = txObject.getConnectionHolder().getConnection();

    ??Integer previousIsolationLevel = DataSourceUtils
    ?????.prepareConnectionForTransaction(con, definition);
    ??txObject.setPreviousIsolationLevel(previousIsolationLevel);
    ??if (con.getAutoCommit())
    ??{
    ???txObject.setMustRestoreAutoCommit(true);
    ???con.setAutoCommit(false);
    ??}
    ??txObject.getConnectionHolder().setTransactionActive(true);
    ??// Bind the session holder to the thread.
    ??if (txObject.isNewConnectionHolder())
    ??{
    ???TransactionSynchronizationManager.bindResource(
    getDataSource(),txObject.getConnectionHolder());
    ??}
    ?}
    ?catch (SQLException ex)
    ?{
    ??DataSourceUtils.releaseConnection(con, this.dataSource);
    ??throw new CannotCreateTransactionException(
    ?????"Could not open JDBC Connection for transaction", ex);
    ?}
    }
    本文出自:http://www.cownew.com
    在調用一個需要事務的組件的時候,管理器首先判斷當前調用(即當前線程)有沒有一個事務,如果沒有事務則啟動一個事務,并把事務與當前線程綁定。Spring使用TransactionSynchronizationManager的bindResource方法將當前線程與一個事務綁定,采用的方式就是ThreadLocal,這可以從TransactionSynchronizationManager類的代碼看出。
    public abstract class TransactionSynchronizationManager
    {
    ?……
    ?private static final ThreadLocal currentTransactionName = new ThreadLocal();
    ?private static final ThreadLocal currentTransactionReadOnly = new ThreadLocal();
    ?private static final ThreadLocal actualTransactionActive = new ThreadLocal();?……
    }
    從doBegin的代碼中可以看到在啟動事務的時候,如果Connection是的自動提交的(也就是getAutoCommit()方法返回true)則事務管理就會失效,所以首先要調用setAutoCommit(false)方法將其改為非自動提交的。setAutoCommit(false)這個動作在有的JDBC驅動中會非常耗時,所以最好在配置數據源的時候就將“autoCommit”屬性配置為true。

    posted on 2007-01-02 23:33 CowNew開源團隊 閱讀(3236) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲人成网亚洲欧洲无码久久| 国产无遮挡吃胸膜奶免费看视频 | 国产亚洲精品自在久久| 中文永久免费观看网站| 四虎在线播放免费永久视频| 亚洲一本一道一区二区三区| 插B内射18免费视频| 国产成+人+综合+亚洲专| 四虎国产精品免费久久| 国产精品高清视亚洲精品| 国语成本人片免费av无码| 亚洲日韩精品无码AV海量| 大陆一级毛片免费视频观看| 亚洲国产欧美一区二区三区| 日韩免费一级毛片| 全部一级一级毛片免费看| 亚洲午夜久久久久妓女影院| 国产成人精品无码免费看 | 亚洲日韩乱码中文无码蜜桃臀网站| 人妻18毛片a级毛片免费看| 亚洲中文字幕无码久久精品1 | 曰批全过程免费视频播放网站| 又色又污又黄无遮挡的免费视| 精品在线观看免费| 美女内射无套日韩免费播放| 亚洲伊人久久大香线蕉在观| 全免费a级毛片免费看无码| 免费无码专区毛片高潮喷水| 亚洲日韩精品A∨片无码| 最近中文字幕mv免费高清在线| 亚洲小说图区综合在线| 亚洲偷自拍拍综合网| 亚洲欧美日韩中文高清www777 | 天天操夜夜操免费视频| 国产亚洲精品欧洲在线观看| 亚洲精品美女久久777777| 国产免费看JIZZ视频| 精品亚洲福利一区二区| 亚洲爱情岛论坛永久| 在线观着免费观看国产黄| 成人无码a级毛片免费|