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

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

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

    如鵬網(wǎng) 大學生計算機學習社區(qū)

    CowNew開源團隊

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

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

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

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

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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 最近的中文字幕大全免费8| 国产精品亚洲色图| 美女被cao网站免费看在线看| 四虎永久免费影院| 日韩国产欧美亚洲v片| 免费无码一区二区三区蜜桃大| 亚洲欧美国产国产综合一区| 国产又黄又爽又猛免费app| 久久亚洲国产成人影院| 无码免费午夜福利片在线| 亚洲中文字幕久久无码| 免费无码成人AV片在线在线播放| 久久久久久亚洲av无码蜜芽| 国产男女性潮高清免费网站 | 国产精品99久久免费| 污污的视频在线免费观看| 亚洲精品国产精品国自产观看 | 亚洲第一精品在线视频| 1000部国产成人免费视频| 亚洲精品国产国语| 亚洲第一页日韩专区| 日本免费高清视频| 欧洲 亚洲 国产图片综合| 亚洲国产一成久久精品国产成人综合 | 免费在线一级毛片| 国内永久免费crm系统z在线 | 可以免费观看的一级毛片| 国产精品玖玖美女张开腿让男人桶爽免费看| 亚洲熟妇中文字幕五十中出| 亚洲免费精彩视频在线观看| 亚洲熟妇AV日韩熟妇在线| 国产亚洲精品不卡在线| 91大神免费观看| 久久久久久久久无码精品亚洲日韩| 激情97综合亚洲色婷婷五| 最近2019免费中文字幕视频三| 亚洲日韩精品无码专区加勒比☆| 亚洲精品在线视频| 国产成人yy免费视频| 国产精品福利片免费看| 亚洲国产精品久久网午夜 |