中回滚TransactionScope的使用方法和原理,中TransactionScope的使用方法和原理

图片 4

中回滚TransactionScope的使用方法和原理,中TransactionScope的使用方法和原理

TransactionScope只要二个操作战败,它会自动回滚,Complete表示事情实现

 

现实上,贰个荒唐的理解正是Complete(卡塔 尔(英语:State of Qatar)方法是交给业务的,那是不当的,事实上,它的法力的象征本作业完毕,它平时位于try{}的结尾处,不用判定前台操作是还是不是成功,若是不成功,它会协调回滚。

 

 

在.net
1.1的有的时候,还未TransactionScope类,由此不菲关于业务的管理,都交给了SqlTransaction和SqlConnection,每种Transaction是依照每种Connection的。这种布署对于超越四个程序集大概四个法子的作业行为来讲,不是老大好,须要把工作和数据库连接作为参数字传送入。

在.net
2.0后,TransactionScope类的面世,大大的简化了业务的希图。示例代码如下:

  1.  

    static void Main(string[]
    args)

  2.  

    {

  3.  

    using
    (TransactionScope ts = new
    TransactionScope())

  4.  

    {

  5.  

    userBLL u = new userBLL();

  6.  

    TeacherBLL t = new TeacherBLL();

  7.  

    u.ADD();

  8.  

    t.ADD();

  9.  

    ts.Complete();

  10.  

    }

  11.  

    }

只必要把须要专业包裹的逻辑块写在using (TransactionScope ts = new
TransactionScope())中就足以了。从这种写法可以看到,TransactionScope达成了IDispose接口。除非展现调用ts.Complete()方法。不然,系统不会活动提交这几个业务。假若在代码运维退出这一个block后,还没调用Complete(),那么事务自动回滚了。在此个业务块中,u.ADD()方法和t.ADD()方法内部都不曾应用任何事务类。

TransactionScope是基于当前线程的,在近些日子线程中,调用Transaction.Current方法能够见到近日作业的信息。具体有关TransactionScope的利用格局,已经它的积极分子方法和属性,能够查看 MSDN.aspx) 。

TransactionScope类是足以嵌套使用,假设要嵌套使用,必要在嵌套事务块中钦赐TransactionScopeOption参数。默许的那一个参数为Required。

该参数的现实性意思能够参见

举个例子上面代码:

  1.  

    static void Main(string[]
    args)

  2.  

    {

  3.  

    using
    (TransactionScope ts = new
    TransactionScope())

  4.  

    {

  5.  

    Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);

  6.  

    userBLL u = new userBLL();

  7.  

    TeacherBLL t = new TeacherBLL();

  8.  

    u.ADD();

  9.  

    using
    (TransactionScope ts2 = new
    TransactionScope(TransactionScopeOption.Required))

  10.  

    {

  11.  

    Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);

  12.  

    t.ADD();

  13.  

    ts2.Complete();

  14.  

    }

  15.  

    ts.Complete();

  16.  

    }

  17.  

    }

当嵌套类的TransactionScope的TransactionScopeOption为Required的时候,则足以观察如下结果,他们的专门的工作的ID皆以同八个。並且,唯有当2个TransactionScope都complete的时候手艺算真的打响。

图片 1

大器晚成经把TransactionScopeOption设为RequiresNew,则嵌套的事务块和外围的事务块各自独立,互不影响。

  1.  

    static void Main(string[]
    args)

  2.  

    {

  3.  

    using
    (TransactionScope ts = new
    TransactionScope())

  4.  

    {

  5.  

    Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);

  6.  

    userBLL u = new userBLL();

  7.  

    TeacherBLL t = new TeacherBLL();

  8.  

    u.ADD();

  9.  

    using
    (TransactionScope ts2 = new
    TransactionScope(TransactionScopeOption.RequiresNew))

  10.  

    {

  11.  

    Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);

  12.  

    t.ADD();

  13.  

    ts2.Complete();

  14.  

    }

  15.  

    ts.Complete();

  16.  

    }

  17.  

    }

图片 2

能够看见,他们的事务id是不平等的。

 

 

TransactionScopeOption的属性值:

 

图片 3

图片 4

图片 5

对于三个分裂服务器之间的数据库操作,TransactionScope正视DTC(Distributed
Transaction Coordinator卡塔尔服务到位作业生龙活虎致性。

不过对于单意气风发服务器数据,TransactionScope的建制则相比复杂。首要用的的是线程静态天性。线程静态本性ThreadStaticAttribute让CLWrangler知道,它标识的静态字段的存取是借助当前线程,而单身于别的线程的。既然存款和储蓄在线程静态字段中的数据只对存款和储蓄该数额的同一线程中所运维的代码可以预知,那么,可接收此类字段将别的数据从叁个措施传递到该第一个方法所调用的其余事办公室法,何况完全不用思念其它线程会毁掉它的干活。TransactionScope
会将眼下的 Transaction 存款和储蓄到线程静态字段中。当稍后实例化 SqlCommand
时(在那 TransactionScope 从线程局地存款和储蓄中删去以前卡塔尔,该 SqlCommand
会检查线程静态字段以搜索现存 Transaction,假使存在则列入该 Transaction
中。通过这种办法,TransactionScope 和 SqlCommand
能够同盟专门的学问,进而开垦职员不一定会将 Transaction 突显传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand 所使用的机制极度复杂。

初藳链接:

在.net
1.1的一代,还平素不TransactionScope类,因而不稀有关业务的拍卖,都提交了SqlTransaction和SqlConnection,各种Transaction是依照各种Connection的。这种规划对于抢先八个程序集也许多少个章程的政华夏银行为的话,不是可怜好,要求把事情和数据库连接作为参数传入。

在.net
2.0后,TransactionScope类的面世,大大的简化了政工的布置性。示例代码如下:

     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())中就足以了。从这种写法可以观察,TransactionScope完结了IDispose接口。除非展现调用ts.Complete()方法。不然,系统不会活动提交那几个业务。假诺在代码运转退出这一个block后,还没有调用Complete(),那么事务自动回滚了。在这里个业务块中,u.ADD()方法和t.ADD()方法内部都并未有采用任何事务类。

TransactionScope是依附当前线程的,在时下线程中,调用Transaction.Current方法能够见见日前专门的工作的新闻。具体有关TransactionScope的采纳办法,已经它的分子方法和质量,可以查阅MSDN.aspx) 。

TransactionScope类是能够嵌套使用,假若要嵌套使用,要求在嵌套事务块中钦赐TransactionScopeOption参数。默许的那么些参数为Required。

该参数的切实可行意思能够仿照效法

譬如下边代码:

static void Main(string[] args)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
                userBLL u = new userBLL();
                TeacherBLL t = new TeacherBLL();
                u.ADD();
                using (TransactionScope ts2 = new TransactionScope(TransactionScopeOption.Required))
                {
                    Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
                    t.ADD();
                    ts2.Complete();
                }
               ts.Complete();
            }
        }

  

当嵌套类的TransactionScope的TransactionScopeOption为Required的时候,则足以看见如下结果,他们的事务的ID都以同三个。而且,独有当2个TransactionScope都complete的时候工夫算真正成功。

图片 6

风度翩翩旦把TransactionScopeOption设为RequiresNew,则嵌套的事务块和外围的事务块各自独立,互不影响。

static void Main(string[] args)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
                userBLL u = new userBLL();
                TeacherBLL t = new TeacherBLL();
                u.ADD();
                using (TransactionScope ts2 = new TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
                    t.ADD();
                    ts2.Complete();
                }
              ts.Complete();
            }
        }

  

图片 7

能够见见,他们的政工id是不少年老成致的。

TransactionScopeOption设为Suppress则为打消当前区块的事务,日常少之甚少使用。

对此四个差别服务器之间的数据库操作,TransactionScope信赖DTC(Distributed
Transaction Coordinator卡塔尔国服务做到作业生龙活虎致性。

不过对于单生机勃勃服务器数据,TransactionScope的编写制定则比较复杂。首要用的的是线程静态性格。线程静态本性ThreadStaticAttribute让CLXC60知道,它标识的静态字段的存取是依据当前线程,而单独于别的线程的。既然存款和储蓄在线程静态字段中的数据只对存款和储蓄该多少的同一线程中所运维的代码可以看到,那么,可接受此类字段将其余数据从多个方法传递到该第三个艺术所调用的其余办法,並且完全不用忧郁其余线程会毁掉它的办事。TransactionScope
会将最近的 Transaction 存款和储蓄到线程静态字段中。当稍后实例化 SqlCommand
时(在那 TransactionScope 从线程局部存款和储蓄中删除在此以前卡塔 尔(阿拉伯语:قطر‎,该 SqlCommand
会检查线程静态字段以寻觅现存 Transaction,假如存在则列入该 Transaction
中。通过这种措施,TransactionScope 和 SqlCommand
能够合营专门的学问,进而开荒人士不一定会将 Transaction 呈现传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand
所使用的建制非常复杂。具体能够参见文章 

Wrox出版的《Professional C# 4 and .NET
4》也许有关于TransactionScope的风流倜傥对行使方法的牵线。

admin

网站地图xml地图