zhuweisky

君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。
ESFramework,基于.NET的通信框架。DataRabbit,轻量的数据访问框架。DCFramework,基于.NET的动态分布式计算框架。sky.zhuwei@163.com

统计

留言簿

积分与排名

好友博客

阅读排行榜

评论排行榜

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

posted on 2007-03-21 16:32 zhuweisky 阅读(3034) 评论(13)  编辑 收藏 网摘 所属分类: DataRabbit

评论

#1楼 2007-03-21 16:46 jhyc[未注册用户]

请教楼主:
IOrmAccesser<Student> stuOrmAccesser = scope.NewOrmAccesser<Student>(trans);

trans在前面没有实例化过,会不会报错的?
  回复  引用    

#2楼[楼主] 2007-03-21 16:51 zhuweisky      

@jhyc:
对不起,代码打错了,我的失误。现已更正。
TransactionScope 中以“New”打头的方法是不需要参数的。
  回复  引用  查看    

#3楼 2007-03-21 19:19 163[未注册用户]

向楼主学习。   回复  引用    

#4楼 2007-03-22 16:01 gsshawn      

写的非常好,这个事物是否支持在一个事务内的不同的数据库联接。
分布式事务。
  回复  引用  查看    

#5楼[楼主] 2007-03-23 10:08 zhuweisky      

@gsshawn:
目前的TransactionScope只支持在同一个数据库内进行事务。
  回复  引用  查看    

#6楼 2007-03-26 09:26 gsshawn      

知道了,有个问题能否请教。
我想把Ado.net访问和现在流行的Nhibernate或者是其他的数据访问框架包起来处理,给别人的感觉并不知道里面用什么来访问的,想换底层访问时,不影响到现在代码。能否给点思路。谢谢。-Msn:gs_shawn@hotmail.com
  回复  引用  查看    

#7楼 2007-06-29 20:30 wang.seraph[未注册用户]

楼主,第一个例子里的
trans = dataAccesser.DataElementFactory.NewConnection().BeginTransaction();
不需要显式OPEN Connection和Close么?


  回复  引用    

#8楼 2007-07-06 08:45 zhuweisky[未注册用户]

to wang.seraph:
需要的。但是不推荐使用第一种方法
  回复  引用    

#9楼 2007-12-22 21:07 duanqs@live.cn      

请问insert 之后如何获取新增数据行 自增 字段的值   回复  引用  查看    

#10楼 2007-12-29 11:55 zhuweisky1[未注册用户]

Entity的自增字段会被自动赋值的
  回复  引用    

#11楼 2008-11-14 19:51 probspy[未注册用户]

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

Dispose是专用的方法,不能做别的事情,否则会带来安全隐患,请楼主三思。
  回复  引用    

#12楼 2008-11-14 19:58 probspy[未注册用户]

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

Dispose是专用方法,做别的用处可能会带来安全隐患,请楼主三思,另外一定会有更简练而安全的写法,楼主不要放弃。
  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 682820




相关文章:

相关链接: