zoukankan      html  css  js  c++  java
  • DataRabbit 轻量的数据访问框架(08) -- DataRabbit 的入口点:TransactionScopeFactory和TransactionScope

       (完全限定类名:DataRabbit.Application.TransactionScopeFactoryDataRabbit.Application.TransactionScope) 
         

         关于TransactionScopeFactory首先要提醒以下几点:
    (1)TransactionScopeFactory是DataRabbit框架的入口点,所有的访问器、
    分页管理器大纲操作者都可以从TransactionScopeFactory生成的TransactionScope(事务范围)处获取。
    (2)TransactionScopeFactory针对的是一个数据库,对于一个特定的数据库,应用程序只需要维护一个TransactionScopeFactory实例(引用)即可。

    (3)可以按照类似下面的代码来构造TransactionScopeFactory实例: 

    DataConfiguration config = new DataConfiguration(DataBaseType.SqlServer, "127.0.0.1""sa"pwd""TestDB"null);
    config.MaxPoolSize 
    = 100//连接池最大连接数
    config.MinPoolSize = 0;   //连接池最小连接数
    config.CommandTimeoutInSecs = 30//执行命令的最大超时时间(s)

    TransactionScopeFactory transactionScopeFactory = new TransactionScopeFactory();
    transactionScopeFactory.DataConfiguration 
    = config;
    transactionScopeFactory.DBExceptionFilter 
    = new DBExceptionFilter("DBException.txt"); 
    transactionScopeFactory.Initialize();

         DBExceptionFilter 用于捕获数据库访问时抛出的任何异常,上面的示例代码表示将会把所有的详细异常信息记录到当前目录的DBException.txt文件中。关于DBExceptionFilter 更详细的介绍,可参见这里


       前面讲了多种访问器,并且这些访问器都继承了ITransactionAccesser接口。我们已经知道,ITransactionAccesser的含义在于:访问器对象即可以工作于一个事务(Transaction)上下文中,也可以在脱离事务的环境中工作。前面举的所有示例中都没有涉及到事务,本文我们将介绍在DataRabbit中如何使用事务。      
       TransactionScope,表示一个事务的范围,我们可以从TransactionScope中获取前述的所有访问器实例,并且从中获取的访问器都是基于事务的(访问器的生命期将随事务的结束而结束)。TransactionScope的类图如下所示:

       首先,我们看到了一些以“New”打头的方法,这些方法用于创建各种基于事务的访问器对象。
       TransactionScope会在构造函数中启动事务,所以我们只有在需要事务的地方才构建TransactionScope实例。TransactionScope实例通常在Business Flow子层中创建。另外,TransactionScope支持两种使用模式:
     (1)自动模式:使用using块 ,将在异常发生时,自动回滚事务。
     (2)手动模式:不使用using块,可根据业务需要手动回滚事务(调用TransactionScope的Rollback方法),更具灵活性。
       
         我们可以通过DataRabbit.Application.TransactionScopeFactory来获得TransactionScope对象。

         下面我们举个非常简单的事务访问的例子,假设某个业务逻辑要求我们在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
                    Student stu = new Student();
                    stu.ID 
    = 33;
                    stu.Age 
    = 28;
                    stuOrmAccesser.Update(stu);

                    
    //插入Book
                    Book book = new Book();
                    book.ID 
    = 9;
                    book.StudentID 
    = stu.ID;
                    bookOrmAccesser.Insert(book);

                    scope.Commit(); //提交事务,别忘了这句            
                }


         上述代码如果在Update或Insert的时候抛出异常,事务将会自动回滚,这是在TransactionScope的Dispose方法中做到的。

         如果不需要事务支持,则transactionScopeFactory.NewTransactionScope(true)方法的参数由true改为false即可,其它的都不用作任何改变,这使得开启/关闭事务的控制变得非常的简单。             


    转到:DataRabbit 轻量的数据访问框架 -- 序

  • 相关阅读:
    POJ 1795 DNA Laboratory
    CodeForces 303B Rectangle Puzzle II
    HDU 2197 本源串
    HDU 5965 扫雷
    POJ 3099 Go Go Gorelians
    CodeForces 762D Maximum path
    CodeForces 731C Socks
    HDU 1231 最大连续子序列
    HDU 5650 so easy
    大话接口隐私与安全 转载
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/682820.html
Copyright © 2011-2022 走看看