【美高梅开户网址】中TransactionScope的应用方法和公理,中回滚TransactionScope的利用方法和原理

TransactionScope只要一个操作战败,它会活动回滚,Complete表示事情完毕

 

现实上,3个荒谬的精通就是Complete()方法是交给业务的,那是不当的,事实上,它的成效的象征本作业完毕,它一般位于try{}的结尾处,不用判断前台操作是不是成功,如若不成功,它会融洽回滚。

 

 

在.net
一.1的时日,还尚无TransactionScope类,由此不少有关业务的处理,都提交了SqlTransaction和SqlConnection,每一个Transaction是依据每个Connection的。那种设计对于超过三个程序集或然多少个方式的业务行为的话,不是13分好,供给把事情和数据库连接作为参数字传送入。

在.net
二.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的运用方法,已经它的分子方法和属性,能够查阅 【美高梅开户网址】中TransactionScope的应用方法和公理,中回滚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都以同二个。并且,只有当一个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)服务到位业务1致性。

不过对于单一服务器数据,TransactionScope的机制则相比复杂。首要用的的是线程静态特性。线程静态天性ThreadStaticAttribute让CL福睿斯知道,它标志的静态字段的存取是信赖当前线程,而单独于别的线程的。既然存储在线程静态字段中的数据只对存款和储蓄该数据的同1线程中所运营的代码可知,那么,可选取此类字段将别的数据从三个措施传递到该第一个点子所调用的其它方法,而且完全不用担心其余线程会毁掉它的干活。TransactionScope
会将近年来的 Transaction 存款和储蓄到线程静态字段中。当稍后实例化 SqlCommand
时(在此 TransactionScope 从线程局地存款和储蓄中除去在此之前),该 SqlCommand
会检查线程静态字段以寻找现有 Transaction,就算存在则列入该 Transaction
中。通过这种方法,TransactionScope 和 SqlCommand
能够协同工作,从而开发人士不必将 Transaction 显示传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand 所使用的建制非凡复杂。

原稿链接:

 

时间 2013-08-12 19:59:34  5一CTO推荐博文

原文  http://cnn237111.blog.51cto.com/2359144/1271600

在.net
一.壹的一代,还未曾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都以同3个。并且,唯有当三个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则为撤废当前区块的工作,1般很少使用。

对此多个例外服务器之间的数据库操作,TransactionScope重视DTC(Distributed
Transaction Coordinator)服务到位工作1致性。

然则对于单1服务器数据,TransactionScope的建制则比较复杂。主要用的的是线程静态性情。线程静态天性ThreadStaticAttribute让CL帕杰罗知道,它标志的静态字段的存取是凭借当前线程,而独自于任何线程的。既然存款和储蓄在线程静态字段中的数据只对存款和储蓄该数额的同1线程中所运维的代码可知,那么,可应用此类字段将其它数据从一个格局传递到该第一个点子所调用的其余艺术,而且完全不用担心此外线程会破坏它的行事。TransactionScope
会将近日的 Transaction 存款和储蓄到线程静态字段中。当稍后实例化 SqlCommand
时(在此 TransactionScope 从线程局地存款和储蓄中去除在此之前),该 SqlCommand
会检查线程静态字段以搜寻现有 Transaction,假若存在则列入该 Transaction
中。通过那种格局,TransactionScope 和 SqlCommand
能够协同工作,从而开发人士不必将 Transaction 彰显传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand
所使用的体制万分复杂。具体能够参考小说

Wrox出版的《Professional C# 四 and .NET
4》也有关于TransactionScope的一些使用方法的牵线。

在.net
1.壹的时日,还尚未TransactionScope类,因而不少有关业务的处理,都付出了SqlTransaction和SqlConnection,各类Transaction是根据每一个Connection的。这种设计对于当先八个程序集或许四个格局的事情行为的话,不是尤其好,须要把作业和数据库连接作为参数字传送入。

在.net
1.一的时代,还平素不TransactionScope类,由此不少有关业务的拍卖,都提交了SqlTransaction和SqlConnection,各类Transaction是依据每一个Connection的。这种布署对于超过多个程序集恐怕八个法子的工作行为的话,不是10分好,供给把事情和数据库连接作为参数字传送入。

在.net
2.0后,TransactionScope类的产出,大大的简化了事情的布署性。示例代码如下:

在.net
二.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();
            }
        }
     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) 。

只须求把须要工作包裹的逻辑块写在using (TransactionScope ts = new
TransactionScope())中就能够了。从那种写法能够看看,TransactionScope达成了IDispose接口。除非展现调用ts.Complete()方法。否则,系统不会活动提交那个业务。如若在代码运维退出那些block后,还未调用Complete(),那么事务自动回滚了。在那个业务块中,u.ADD()方法和t.ADD()方法内部都尚未使用任何事务类。

TransactionScope类是能够嵌套使用,假若要嵌套使用,要求在嵌套事务块中钦赐TransactionScopeOption参数。暗中认可的那一个参数为Required。

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都以同三个。并且,唯有当1个TransactionScope都complete的时候才能算真的打响。

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();
            }
        }

美高梅开户网址 8

  

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

当嵌套类的TransactionScope的TransactionScopeOption为Required的时候,则足以看来如下结果,他们的事情的ID都以同三个。并且,唯有当3个TransactionScope都complete的时候才能算真正成功。

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();
            }
        }

美高梅开户网址 9

美高梅开户网址 10

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

能够看看,他们的政工id是不一致的。

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();
            }
        }

TransactionScopeOption设为Suppress则为打消当前区块的业务,一般很少使用。

  

对此五个例外服务器之间的数据库操作,TransactionScope重视DTC(Distributed
Transaction Coordinator)服务到位工作一致性。

美高梅开户网址 11

然则对于单一服务器数据,TransactionScope的建制则比较复杂。紧要用的的是线程静态天性。线程静态天性ThreadStaticAttribute让CL酷威知道,它标志的静态字段的存取是凭借当前线程,而独自于任何线程的。既然存款和储蓄在线程静态字段中的数据只对存款和储蓄该数额的同1线程中所运维的代码可见,那么,可利用此类字段将此外数据从二个格局传递到该第三个措施所调用的别的情势,而且完全不用担心其它线程会破坏它的行事。TransactionScope
会将近年来的 Transaction 存款和储蓄到线程静态字段中。当稍后实例化 SqlCommand
时(在此 TransactionScope 从线程局地存储中除去在此之前),该 SqlCommand
会检查线程静态字段以寻找现有 Transaction,假设存在则列入该 Transaction
中。通过那种方法,TransactionScope 和 SqlCommand
能够协同工作,从而开发人士不必将 Transaction 显示传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand
所使用的体制相当复杂。具体能够参考作品

能够看到,他们的事务id是不相同的。

Wrox出版的《Professional C# 四 and .NET
4》也有关于TransactionScope的1部分行使方法的介绍。

TransactionScopeOption设为Suppress则为收回当前区块的事务,1般很少使用。

 

对于多少个分裂服务器之间的数据库操作,TransactionScope重视DTC(Distributed
Transaction Coordinator)服务到位业务一致性。

若是您觉得文章有用,也足以给水发个微信小额红包鼓励鼓励!!!

只是对于单一服务器数据,TransactionScope的建制则相比较复杂。首要用的的是线程静态特性。线程静态本性ThreadStaticAttribute让CLLacrosse知道,它标志的静态字段的存取是凭借当前线程,而单身于任何线程的。既然存款和储蓄在线程静态字段中的数据只对存款和储蓄该数额的同一线程中所运转的代码可知,那么,可使用此类字段将别的数据从一个情势传递到该第三个情势所调用的其他措施,而且完全不用担心其它线程会破坏它的做事。TransactionScope
会将最近的 Transaction 存款和储蓄到线程静态字段中。当稍后实例化 SqlCommand
时(在此 TransactionScope 从线程局地存款和储蓄中删除在此之前),该 SqlCommand
会检查线程静态字段以寻找现有 Transaction,尽管存在则列入该 Transaction
中。通过那种措施,TransactionScope 和 SqlCommand
能够协同工作,从而开发人士不必将 Transaction 显示传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand
所使用的机制十二分复杂。具体可以参考小说 

美高梅开户网址 12

Wrox出版的《Professional C# 肆 and .NET
四》也有关于TransactionScope的局地行使方法的牵线。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图