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

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

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

    Thinking in sky

    --老賀的BLOG

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      21 隨筆 :: 0 文章 :: 35 評論 :: 0 Trackbacks
    先看一段代碼:
    1Connection conn = Conn.getConnection();
    2    conn.setAutoCommit(false);
    3    ……..
    4    ……
    5    conn.rollback();
    6    conn.commit(); 
    7
    數據庫的事務是針對 Connection 的。

       
    接著再看一段代碼:( spring 中事務的一段學習代碼,這段代碼是把 spring hibernate 結合在一起的,增加了理解上的難度,因為我的出發點一開始不要 hibernate ,就光用 jdbc 來進行數據庫事務,但是沒有其他好的代碼,就這樣吧)
     1public Long addLineItem(Long orderId, LineItem lineItem)
     2
     3       log("OrderListDAOHibernate.addLineItem : Start"); 
     4
     5       OrderList orderList = (OrderList) getHibernateTemplate().load(OrderList.class, orderId); 
     6
     7       lineItem.setOrderList(orderList); 
     8
     9       getHibernateTemplate().saveOrUpdate(lineItem); 
    10
    11       getHibernateTemplate().saveOrUpdate(orderList); 
    12
    13       log("OrderListDAOHibernate.addLineItem : Ending"); 
    14
    15       return lineItem.getId(); 
    16
    17    }

    18
    19

    在這個代碼的配置文件中,把 addLineItem 做為一個切入點,進行事務,也就是說,在 addLineItem 的外面,再包上一層事務的外殼。

       
    但是這個時候,問題出來了,事務是針對 Connection 的,而上面的兩個連續的 HibernateTemplate 執行的 saveOrUpdate 中的 Connection 必須是一致才能用事務, spring 怎么做到這一點的呢?(這個問題也就是在找 spring 的事務例子前,我想的 spring 中用 jdbc 來進行事務,怎么樣讓 Connection 保持一致呢?但是沒有 jdbc 的例子,只有整合 hibernate 或者 ibatis 的例子,但是,我想,原理是一樣的吧。)

     

        解決問題的思路: HibernateTemplate 中的 Connection 必定一致。那么就從 HibernateTemplate 入手。

        spring 的源代碼,既然是 Hibernate ,那么,就沒有 Connection 給你看,只有 Session ,由 Session 來管理 Connection ,那么用事務來控制的話,這個 Session 必定在所有該事務中是一致的。于是在 HibernateTemplate 中找到:

     1protected Session getSession() 
     2
     3       if (isAlwaysUseNewSession()) 
     4
     5return SessionFactoryUtils.getNewSession(getSessionFactory(), getEntityInterceptor()); 
     6
     7       }
     
     8
     9       else if (!isAllowCreate()) 
    10
    11return SessionFactoryUtils.getSession(getSessionFactory(), false); 
    12
    13       }
     
    14
    15       else 
    16
    17return SessionFactoryUtils.getSession( 
    18
    19                  getSessionFactory(), getEntityInterceptor(), getJdbcExceptionTranslator()); 
    20
    21       }
     
    22
    23    }
     
    24
    25

    看來在 SessionFactoryUtils 里面,接著在 SessionFactoryUtils.getSession 中找:

     

    這個方法太長了,太復雜了,從簡,發現了非常關鍵的一點:

    1SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory); 
    2
    3

    假如 sessionHolder 不等于空,說明,在事務中有這樣一個還沒有 commit session ,那么就返回這個 session ,假如等于空,新建一個 session ,并且在事務里加入這個 session 。這段代碼的意思大概是這樣,太繁雜了,只能猜,也肯定是如此。

     

    再看 getHibernateTemplate() 方法來自繼承 HibernateDaoSupport ,看了電子書《 spring-reference 》的第九章“ Dao 支持”, Dao 的支持類可以有好多,如: JdbcDaoSupport HibernateDaoSupport JdoDaoSupport 等等。

     

    既然前面一開始就是從 jdbc spring 事務控制引起的,那么看到了同樣的 HibernateDaoSupport---JdbcDaoSupport ,那么 JdbcDaoSupport 也應該有 getJdbcTemplate() 這個方法,并且返回 JdbcTemplate 這個類。

     

    果然如此。

     

    于是剖析 JdbcTemplate 是不是和 HibernateTemplate 一樣。果然一樣。

     

    注意到:

    Connection con = DataSourceUtils.getConnection(getDataSource()); 

    Connection 是從 DataSourceUtils.getConnection() 來的,繼續跟蹤 DataSourceUtils.getConnection()

     

    找到:

    ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);

     

    Hibernate 中的一模一樣,因為沒有了 session 的封裝,條理在 jdbc 中更加清晰了。

     

    至此, spring 的事務控制 已經全部搞定。

    posted on 2007-05-11 17:42 老賀 閱讀(400) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 在线看片免费人成视频福利| 国产免费观看青青草原网站| 亚洲精品国产精品乱码不卡| 亚洲国产香蕉人人爽成AV片久久| 国产AⅤ无码专区亚洲AV| 亚洲精品乱码久久久久久蜜桃不卡| 日韩一卡2卡3卡4卡新区亚洲| 国产亚洲精品一品区99热| 亚洲麻豆精品果冻传媒| 国产乱子影视频上线免费观看| 国产一级大片免费看| 亚洲日韩图片专区第1页| 亚洲免费视频观看| 日木av无码专区亚洲av毛片| 亚洲高清无码综合性爱视频| 亚洲gv猛男gv无码男同短文| 很黄很黄的网站免费的| 成人毛片免费观看视频| 亚洲码国产精品高潮在线| ASS亚洲熟妇毛茸茸PICS| 成在人线av无码免费高潮喷水 | 亚洲综合色婷婷在线观看| 免费毛片a线观看| 免费在线观看的黄色网址| 91亚洲精品麻豆| 久久免费线看线看| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 最近免费2019中文字幕大全| 免费网站看av片| 亚洲夜夜欢A∨一区二区三区| 亚洲AV无码国产精品色| 蜜臀亚洲AV无码精品国产午夜.| 黄网站在线播放视频免费观看| 色吊丝性永久免费看码 | 人人狠狠综合久久亚洲88| 特级毛片aaaa免费观看| 亚洲国产精品毛片av不卡在线 | 亚洲AV午夜福利精品一区二区| 污污视频免费观看网站| 成a人片亚洲日本久久| 成**人免费一级毛片|