DataRabbit 轻量的数据访问框架(08) -- Dat

系统 1690 0

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

关于TransactionScopeFactory首先要提醒以下几点:
(1)TransactionScopeFactory是DataRabbit框架的入口点,所有的访问器、 分页管理器 大纲操作者 都可以从TransactionScopeFactory生成的TransactionScope(事务范围)处获取。
(2)TransactionScopeFactory针对的是一个数据库,对于一个特定的数据库,应用程序只需要维护一个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 ; // 连接池最大连接数
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的类图如下所示:
DataRabbit 轻量的数据访问框架(08) -- DataRabbit 的入口点:TransactionScopeFactory和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
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 )方法的参数由 true 改为 false 即可,其它的都不用作任何改变,这使得开启/关闭事务的控制变得非常的简单。


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

DataRabbit 轻量的数据访问框架(08) -- DataRabbit 的入口点:TransactionScopeFactory和TransactionScope


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论