(完全限定類名:
      
        DataRabbit.Application.TransactionScopeFactory
      
       ,
      
        DataRabbit.Application.TransactionScope
      
      )
      
    
  
    
      關于TransactionScopeFactory首先要提醒以下幾點:
      
       (1)TransactionScopeFactory是DataRabbit框架的入口點,所有的訪問器、
      
        分頁管理器
      
      、
      
        大綱操作者
      
      都可以從TransactionScopeFactory生成的TransactionScope(事務范圍)處獲取。
      
       (2)TransactionScopeFactory針對的是一個數(shù)據(jù)庫,對于一個特定的數(shù)據(jù)庫,應用程序只需要維護一個TransactionScopeFactory實例(引用)即可。
    
  
(3)可以按照類似下面的代碼來構造TransactionScopeFactory實例:
      <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
      
        
          DataConfiguration
        
        config
      
      
        =
      
      
      
      
        new
      
      
        
          DataConfiguration
        
        (DataBaseType.SqlServer,
      
      
        "
      
      
        127.0.0.1
      
      
        "
      
      
        ,
      
      
        "
      
      
        sa
      
      
        "
      
      
        ,
      
      
        pwd
      
      
        "
      
      
        ,
      
      
        "
      
      
        TestDB
      
      
        "
      
      
        ,
      
      
        null
      
      
        );
        
         config.MaxPoolSize
      
      
        =
      
      
      
      
        100
      
      
        ;
      
      
        //
      
      
        連接池最大連接數(shù)
      
      
        
      
      
        config.MinPoolSize
      
      
        =
      
      
      
      
        0
      
      
        ;
      
      
        //
      
      
        連接池最小連接數(shù)
      
      
        
      
      
        config.CommandTimeoutInSecs
      
      
        =
      
      
      
      
        30
      
      
        ;
      
      
        //
      
      
        執(zhí)行命令的最大超時時間(s)
      
      
        
      
    
      
        
          TransactionScopeFactory
        
        transactionScopeFactory
      
      
        =
      
      
      
      
        new
      
      
        
          TransactionScopeFactory
        
        ();
        
         transactionScopeFactory.DataConfiguration
      
      
        =
      
      
        config;
        
         transactionScopeFactory.DBExceptionFilter
      
      
        =
      
      
      
      
        new
      
      
        
          DBExceptionFilter
        
        (
      
      
        "
      
      
        DBException.txt
      
      
        "
      
      
        );
        
         transactionScopeFactory.Initialize();
      
    
DBExceptionFilter 用于捕獲數(shù)據(jù)庫訪問時拋出的任何異常,上面的示例代碼表示將會把所有的詳細異常信息記錄到當前目錄的 DBException.txt 文件中。關于DBExceptionFilter 更詳細的介紹,可參見 這里 。
    
      
      
        前面講了多種訪問器,并且這些訪問器都繼承了
        
          ITransactionAccesser
        
        接口。我們已經知道,ITransactionAccesser的含義在于:訪問器對象即可以工作于一個事務(Transaction)上下文中,也可以在脫離事務的環(huán)境中工作。前面舉的所有示例中都沒有涉及到事務,本文我們將介紹在DataRabbit中如何使用事務。
        
         TransactionScope,表示一個事務的范圍,我們可以從TransactionScope中獲取前述的所有訪問器實例,并且從中獲取的訪問器都是基于事務的(訪問器的生命期將隨事務的結束而結束)。TransactionScope的類圖如下所示:
        
      
      
         
      
      
       首先,我們看到了一些以“New”打頭的方法,這些方法用于創(chuàng)建各種基于事務的訪問器對象。
      
       TransactionScope會在構造函數(shù)中啟動事務,所以我們只有在需要事務的地方才構建TransactionScope實例。TransactionScope實例通常在Business Flow子層中創(chuàng)建。另外,TransactionScope支持兩種使用模式:
      
       (1)自動模式:使用using塊 ,將在異常發(fā)生時,自動回滾事務。
      
       (2)手動模式:不使用using塊,可根據(jù)業(yè)務需要手動回滾事務(調用TransactionScope的Rollback方法),更具靈活性。
      
      
       我們可以通過DataRabbit.Application.TransactionScopeFactory來獲得TransactionScope對象。
    
  
下面我們舉個非常簡單的事務訪問的例子,假設某個業(yè)務邏輯要求我們在Update某個student的Age的時候,必須在Book表中插入一條相關記錄,這是一個事務性的動作。使用TransactionScope,我們可以輕易達成目標:
      
        //
      
      
        transactionScopeFactory通常以singleton模式使用
      
      
        
      
      
        
          TransactionScopeFactory
        
        transactionScopeFactory
      
      
        =
      
      
        ...;
      
    
      
        
      
      
        using
      
      
        (
        
          TransactionScope
        
        scope
      
      
        =
      
      
        transactionScopeFactory.NewTransactionScope(
        
          true
        
        ))
        
         {
        
        
          IOrmAccesser
        
      
      
        <
      
      
        Student
      
      
        >
      
      
        stuOrmAccesser
      
      
        =
      
      
        scope.
        
          NewOrmAccesser
        
      
      
        <
      
      
        Student
      
      
        >
      
      
        ();
        
        
          IOrmAccesser
        
      
      
        <
      
      
        Book
      
      
        >
      
      
        bookOrmAccesser
      
      
        =
      
      
        scope.
        
          NewOrmAccesser
        
      
      
        <
      
      
        Book
      
      
        >
      
      
        ();
        
        
      
      
        //
      
      
        更新Student
      
      
        
      
      
        Studentstu
      
      
        =
      
      
      
      
        new
      
      
        Student();
        
         stu.ID
      
      
        =
      
      
      
      
        33
      
      
        ;
        
         stu.Age
      
      
        =
      
      
      
      
        28
      
      
        ;
        
         stuOrmAccesser.Update(stu);
        
        
      
      
        //
      
      
        插入Book
      
      
        
      
      
        Bookbook
      
      
        =
      
      
      
      
        new
      
      
        Book();
        
         book.ID
      
      
        =
      
      
      
      
        9
      
      
        ;
        
         book.StudentID
      
      
        =
      
      
        stu.ID;
        
         bookOrmAccesser.Insert(book);
        
        
         scope.Commit();//提交事務,別忘了這句
        
         }
      
    
    
     上述代碼如果在Update或Insert的時候拋出異常,事務將會自動回滾,這是在TransactionScope的Dispose方法中做到的。
  
    如果不需要事務支持,則transactionScopeFactory.NewTransactionScope(
    
      true
    
    )方法的參數(shù)由
    
      true
    
    改為
    
      false
    
    即可,其它的都不用作任何改變,這使得開啟/關閉事務的控制變得非常的簡單。
    
    
    
     轉到:
    
      DataRabbit 輕量的數(shù)據(jù)訪問框架 -- 序
    
    
    
  
DataRabbit 輕量的數(shù)據(jù)訪問框架(08) -- DataRabbit 的入口點:TransactionScopeFactory和TransactionScope
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061
 
					微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
 
					

