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 轻量的数据访问框架 -- 序

  • 相关阅读:
    LeetCode344
    LeetCode18四数之和扩展N数之和
    LeetCode383赎金信
    2018-2020创业总结
    LeetCode454四数相加
    普通dll项目添加WPF的Window对象
    WPF中RadioButton的数据绑定
    02 C# 文件压缩与解压
    WPF 使用附加属性声明 ICommand
    自定义WPF分页控件
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/682820.html
Copyright © 2011-2022 走看看