在三层架构的B层应用TransactionScope事务

来源:互联网 发布:红色草原软件 编辑:程序博客网 时间:2024/05/20 04:14

       一说到事务大家都会想到在存储过程中使用事务,这样可以保证多表操作时的数据一致性。但是三层架构中D层的方法很多都是针对单表操作的,与之对应的数据库存储过程一般也只涉及到关系密切的几个表而已。但是当我们的B层业务需要对很多表进行操作时,用存储过程来保证事务性显得灵活性不够。那么怎样才能在B层使用事物呢?


        我上网查过很多资料,大部分都是用SqlTransaction这个类来在程序代码中保证事务性,但是SqlTransaction是与SQL Server数据库相关的类,如果将这个类用在了B层,那么就突破了三层架构的底线了,如果将来换数据库(比如从SQL Server换到Oracle),D层和B层都得重写,所以这样做的局限性很大。

      后来我在网上查到了一个轻量级的事物类TransactionScope,这个类是与具体数据库无关的类,用这个类来保证B层的事务性十分可行。


     下面说一下这个类的基本用法

      在TransactionScope中默认的事务级别是Serializable,即在事务过程中,完全性锁表。别的进程不能查询,修改,新增,删除。这样会导致效率大大降低,虽然数据完整性很高。通常我们不需要那么高的数据完整性。所以需要修改默认的事务级别:

通过TransactionOptions类来改变事物的级别

TransactionOptions option = new TransactionOptions();option.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;

然后用option作为TransactionScope的构造函数的参数就可以建立低级别的TransactionScope对象了

using(TransactionScope scope=new TransactionScope(TransactionScopeOption.Required,option)){      //此处为需要保证事务性的多个方法            if(方法全部执行成功)      {            scope.Complete();//提交事务      }}

注:方法是否执行成功可以通过方法的返回值来判断,因为B层调用D层的方法返回的一般都是bool值,所以只要所有的方法返回值都是true,那么就可以提交事务了,否则将不提交事务,using中的代码相当于没有被执行一样


原创粉丝点击