C#中的TransactionScope基础了解

1 TransactionScope介绍

TransactionScope是.Net Framework 2.0之后,新增了一个名称空间。它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事务。

还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Connection的。这种设计对于跨越多个程序集或者多个方法的事务行为来说,不是非常好,需要把事务和数据库连接作为参数传入。

在.net 2.0后,TransactionScope类的出现,大大的简化了事务的设计。

transactionScope001.png

2 包含的方法

序号 名称 说明
01 Complete() 指示范围内的所有操作都已成功都完成。
02 Dispose() 结束事务范围。

3 一般用法

如果A类是使用数据库资源的。
class  A
{
SqlConnection cn=null;
public A()
{
.....
cn.open();
}
}
//开始事务
using(transactionscope scope=new transactionscope())
{
//要确保对支持事务的资源的登记放在此范围内,如数据库资源的打开
A a=new A();
a.method();
.....
scope.comlete()
} 
我们只要确保数据库的打开操作是在事务范围内打开就行了。这样就可以做到事务的正确操作。
以前的代码是因为一个业务对象的初始化操作在外部进行了。尽管后来在事务范围内进行业务操作,也不行.
A a=new A();
using(transactionscope scope=new transactionscope())
{
//要确保对支持事务的资源的登记放在此范围内,如数据库资源的打开

a.method();
.....
scope.comlete()
} 
上述代码,其实是没有参与任何事务的。对于子事务而已也是一样,只要保证事务登记在事务范围内才正确

4 回滚TransactionScope的使用方法

TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成

实事上,一个错误的理解就是Complete()方法是提交事务的,这是错误的,事实上,它的作用的表示本事务完成,它一般放在try{}的结尾处,不用判断前台操作是否成功,如果不成功,它会自己回滚。

如下代码:

static void Main(string[] args)
{
     using (TransactionScope ts = new TransactionScope())
    {
        userBLL u = new userBLL();
        TeacherBLL t = new TeacherBLL();
        u.ADD();
        t.ADD();
        ts.Complete();
    }
}

只需要把需要事务包裹的逻辑块写在using (TransactionScope ts = new TransactionScope())中就可以了。

Complete指示范围内的所有操作都已成功都完成。当范围内的所有操作都已成功都完成,应调用此方法仅一次以通知该事务管理器上的所有资源的状态都是一致的并可以提交该事务。未能调用此方法将中止事务,因为事务管理器会将此视为系统故障时,或者在事务范围内引发的异常。 但是,您还应注意,调用此方法不保证事务的提交。 它只是一种将状态通知给事务管理器的方式。 调用此方法后,您将不再能够访问环境事务通过 Current 属性,这样会引发异常。