<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)站導航:
     
    主站蜘蛛池模板: 亚洲成AV人片在线观看无| 中文字幕中韩乱码亚洲大片| 亚洲网站在线观看| a级毛片在线免费观看| 国产黄色一级毛片亚洲黄片大全| 成年大片免费高清在线看黄| 国产一级高清免费观看| 亚洲AV无码AV日韩AV网站| 五月天婷亚洲天综合网精品偷| 黄色网页免费观看| 亚洲国产V高清在线观看| fc2免费人成在线| 亚洲大尺度无码无码专区| 三年片在线观看免费大全电影 | 69av免费观看| 亚洲成a人片在线网站| 99久久久精品免费观看国产| 国产成人亚洲综合一区| 男女交性永久免费视频播放| 污污的视频在线免费观看| 色噜噜亚洲精品中文字幕| 日韩在线不卡免费视频一区| 亚洲综合无码无在线观看| 国产乱色精品成人免费视频| 精品一区二区三区高清免费观看 | 久久免费视频99| 亚洲人成电影网站久久| 亚洲av无码国产精品色在线看不卡| 国产精品偷伦视频免费观看了| 久久亚洲国产视频| 毛色毛片免费观看| 黄页网址大全免费观看12网站| 亚洲成a人片在线观看日本| 国拍在线精品视频免费观看 | 大学生一级毛片免费看| 疯狂做受xxxx高潮视频免费| 日本亚洲欧洲免费天堂午夜看片女人员 | 成**人免费一级毛片| 亚洲人成人伊人成综合网无码| 亚洲欧洲日产国码一级毛片| 久久久久高潮毛片免费全部播放|