如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

          CowNew開源團(tuán)隊(duì)

          http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評(píng)論 :: 0 Trackbacks

          Spring 事務(wù)管理創(chuàng)造性的解決了很多以前要用重量級(jí)的應(yīng)用服務(wù)器才能解決的事務(wù)問題,那么其實(shí)現(xiàn)原理一定很深?yuàn)W吧?可是如果讀者仔細(xì)研究了Spring事務(wù)管理的代碼以后就會(huì)發(fā)現(xiàn),事務(wù)管理其實(shí)也是如此簡(jiǎn)單的事情。這也印證了在本書開頭的一句話“重劍無鋒、大巧不工”,Spring并沒有使用什么特殊的API,它運(yùn)行的原理就是事務(wù)的原理。下面是DataSourceTransactionManager的啟動(dòng)事務(wù)用的代碼(經(jīng)簡(jiǎn)化):
          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
          在調(diào)用一個(gè)需要事務(wù)的組件的時(shí)候,管理器首先判斷當(dāng)前調(diào)用(即當(dāng)前線程)有沒有一個(gè)事務(wù),如果沒有事務(wù)則啟動(dòng)一個(gè)事務(wù),并把事務(wù)與當(dāng)前線程綁定。Spring使用TransactionSynchronizationManager的bindResource方法將當(dāng)前線程與一個(gè)事務(wù)綁定,采用的方式就是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的代碼中可以看到在啟動(dòng)事務(wù)的時(shí)候,如果Connection是的自動(dòng)提交的(也就是getAutoCommit()方法返回true)則事務(wù)管理就會(huì)失效,所以首先要調(diào)用setAutoCommit(false)方法將其改為非自動(dòng)提交的。setAutoCommit(false)這個(gè)動(dòng)作在有的JDBC驅(qū)動(dòng)中會(huì)非常耗時(shí),所以最好在配置數(shù)據(jù)源的時(shí)候就將“autoCommit”屬性配置為true。

          posted on 2007-01-02 23:33 CowNew開源團(tuán)隊(duì) 閱讀(3238) 評(píng)論(0)  編輯  收藏

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 亳州市| 江都市| 汉阴县| 甘谷县| 襄垣县| 修水县| 唐山市| 龙里县| 乌审旗| 巴林左旗| 安陆市| 珠海市| 南岸区| 简阳市| 筠连县| 灵山县| 杂多县| 剑川县| 普定县| 泰安市| 锡林浩特市| 屯留县| 松桃| 揭阳市| 安庆市| 温宿县| 乐业县| 黑山县| 桐梓县| 盘锦市| 兴义市| 汾阳市| 黄冈市| 原平市| 清流县| 泸水县| 奇台县| 耿马| 恭城| 清原| 财经|