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

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

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

    posts - 193,  comments - 520,  trackbacks - 0
    ibatis DAO 框架提供了事務管理模塊。而這個事務管理可以應用到很多場合,包括JDBC、Hibernate、JTA、SQLMAP等。
    下面以最簡單的JDBC來分析一下其如何實現事務管理。
    首先來看一段代碼:
    public class OrderService {

      
    private DaoManager daoManager;

      
    private OrderDao orderDao;

      
    public OrderService() {
        daoManager 
    = DaoConfig.getDaoManager();
        orderDao 
    = (OrderDao) daoManager.getDao(OrderDao.class);
      }


      
    public void method() {
        
    try {
          
    //  a separate transaction
          orderDao.method1();   //第一個事務

          daoManager.startTransaction(); 
    //開始第二個事務

          orderDao.method1();
          orderDao.method2();

          daoManager.commitTransaction();
    //提交第二個事務
        }
     finally {
          daoManager.endTransaction();
        }

      }

      }
      在method()方法里有著兩個事務,如果在方法里不顯式的調用daoManager.startTransaction(),則每個DAO的一次方法調用就是一個獨立的事務。
      ibatis DAO事務,有兩個核心接口DaoTransactionManager和DaoTransaction
      對應著不同的數據庫持久層實現,兩個接口分別對應著不同實現
      查看ibatis 代碼,可以發現這些manager實現事務,就是調用事務源的事務操作方法

      JdbcDaoTransactionManager
      public void commitTransaction(DaoTransaction trans) {
        ((JdbcDaoTransaction) trans).commit();
      }

     JdbcDaoTransaction
      public JdbcDaoTransaction(DataSource dataSource) {
        
    try {
          connection 
    = dataSource.getConnection();
          
    if (connection == null{
            
    throw new DaoException("Could not start transaction.  Cause: The DataSource returned a null connection.");
          }

          
    if (connection.getAutoCommit()) {
            connection.setAutoCommit(
    false);
          }

          
    if (connectionLog.isDebugEnabled()) {
            connection 
    = ConnectionLogProxy.newInstance(connection);
          }

        }
     catch (SQLException e) {
          
    throw new DaoException("Error starting JDBC transaction.  Cause: " + e);
        }

      }

      
      
    public void commit() {
        
    try {
          
    try {
            connection.commit();
          }
     finally {
            connection.close();
          }

        }
     catch (SQLException e) {
          
    throw new DaoException("Error committing JDBC transaction.  Cause: " + e);
        }

      }

      那么DaoTransactionManager以什么依據處理事務呢?DaoTransactionState看看DaoTransactionState的代碼,非常簡單,四個常量來表示事務處于的不同的狀態
      public static final DaoTransactionState ACTIVE = new DaoTransactionState();
      
    public static final DaoTransactionState INACTIVE = new DaoTransactionState();
      
    public static final DaoTransactionState COMMITTED = new DaoTransactionState();
      
    public static final DaoTransactionState ROLLEDBACK = new DaoTransactionState(); 
      那么實際程序中是如何控制事務的呢
      在第一段代碼中,我們是這樣取得DAO
      orderDao = (OrderDao) daoManager.getDao(OrderDao.class);
      實際daoManager返回的并不是orderDao的具體實現類,它返回的DaoProxy

    DaoProxy
      public Object invoke(Object proxy, Method method, Object[] args)
          
    throws Throwable {
        Object result 
    = null;
        
    if (PASSTHROUGH_METHODS.contains(method.getName())) {
          
    try {
            result 
    = method.invoke(daoImpl.getDaoInstance(), args);
          }
     catch (Throwable t) {
            
    throw ClassInfo.unwrapThrowable(t);
          }

        }
     else {
          StandardDaoManager daoManager 
    = daoImpl.getDaoManager();
          DaoContext context 
    = daoImpl.getDaoContext();

          
    if (daoManager.isExplicitTransaction()) {
            
    // Just start the transaction (explicit)
            try {
              context.startTransaction();
              result 
    = method.invoke(daoImpl.getDaoInstance(), args);
            }
     catch (Throwable t) {
              
    throw ClassInfo.unwrapThrowable(t);
            }

          }
     else {
            
    // Start, commit and end the transaction (autocommit)
            try {
              context.startTransaction();
              result 
    = method.invoke(daoImpl.getDaoInstance(), args);
              context.commitTransaction();
            }
     catch (Throwable t) {
              
    throw ClassInfo.unwrapThrowable(t);
            }
     finally {
              context.endTransaction();
            }

          }


        }

        
    return result;
      }
      看到這段代碼就非常清楚了,每調用DAO的一次方法時,如果不顯式的調用daoManager.startTransaction(),就會成為單獨的一個事務。再看看ibatis為我們提供的摸板JdbcDaoTemplate
      protected Connection getConnection() {
        DaoTransaction trans 
    = daoManager.getTransaction(this);
        
    if (!(trans instanceof ConnectionDaoTransaction)) {
          
    throw new DaoException("The DAO manager of type " + daoManager.getClass().getName() +
              
    " cannot supply a JDBC Connection for this template, and is therefore not" +
              
    "supported by JdbcDaoTemplate.");
        }

        
    return ((ConnectionDaoTransaction) trans).getConnection();
      }

      ibatis控制多個DAO的事務實際是讓這些DAO共用了一個DaoTransaction(ThreadLocal),一個Connection
     
      這里是一個事務源的情況,如果多個事務源之間要完成全局事務,還是老老實實用分布式事務管理服務吧(jta)

    http://www.tkk7.com/ronghao 榮浩原創,轉載請注明出處:)
    posted on 2006-01-20 17:50 ronghao 閱讀(7228) 評論(6)  編輯  收藏 所屬分類: 工作日志

    FeedBack:
    # re: ibatis DAO 事務探索
    2006-12-06 03:14 | ..
    無聊  回復  更多評論
      
    # re: ibatis DAO 事務探索
    2007-02-10 11:58 | yidinghe
    很棒!很有啟發性!謝謝!  回復  更多評論
      
    # re: ibatis DAO 事務探索
    2007-07-25 23:43 | zph
    不錯,謝謝  回復  更多評論
      
    # re: ibatis DAO 事務探索
    2008-03-26 10:37 | 屹礫
    先看一下,我也遇到了這個問題,一個事務操縱多個行為,不過事務總是沒有原子性,比較嚴重。  回復  更多評論
      
    # re: ibatis DAO 事務探索
    2009-10-23 13:19 | w
    @..
    人家辛苦發表- -說無聊真欠揍  回復  更多評論
      
    # re: ibatis DAO 事務探索
    2011-03-16 02:35 | leekiang
    這里的好幾個類在2.3版本里好像都去掉了  回復  更多評論
      
    <2006年1月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    關注工作流和企業業務流程改進。現就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

    常用鏈接

    留言簿(38)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    常去的網站

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产免费久久精品99re丫y| 成年女人午夜毛片免费看| 好男人看视频免费2019中文| 亚洲精品美女久久久久99小说| 亚洲a在线视频视频| 亚洲Aⅴ在线无码播放毛片一线天 亚洲avav天堂av在线网毛片 | 亚洲AⅤ永久无码精品AA| 久久精品国产亚洲av四虎| 亚洲欧美aⅴ在线资源| 97人妻精品全国免费视频| 成人A级毛片免费观看AV网站| 在线亚洲精品福利网址导航| 亚洲国产成人精品青青草原| 日韩大片在线永久免费观看网站 | 性生大片视频免费观看一级| 久久久久久国产a免费观看黄色大片 | 亚洲AV天天做在线观看| 亚洲国产精品成人AV在线| 日本黄色动图免费在线观看| 国产高清在线精品免费软件| 久久亚洲AV成人无码| igao激情在线视频免费| 好爽…又高潮了毛片免费看| 亚洲大片在线观看| 免费一级特黄特色大片| 久久久久久免费视频| 亚洲成年轻人电影网站www| 日韩久久无码免费毛片软件| A在线观看免费网站大全| 亚洲AV无码久久| 日韩在线视频线视频免费网站| 免费毛片a在线观看67194 | 亚洲毛片基地日韩毛片基地| 一级做a爱片特黄在线观看免费看| 免费一本色道久久一区| 亚洲四虎永久在线播放| 国产无遮挡色视频免费观看性色| 成年人在线免费看视频| 亚洲网站免费观看| 国产日韩AV免费无码一区二区| 免费一级毛片不卡在线播放|