TransactionScope只要一个操作失败,它会活动回滚,Complete表示事情实现

 

事实上,二个荒谬的精晓正是Complete()方法是提交业务的,那是大错特错的,事实上,它的作用的代表本作业实现,它1般位于try{}的结尾处,不用判断前台操作是还是不是中标,假如不成事,它会融洽回滚。

中TransactionScope的应用方式和法则,中回滚TransactionScope的利用方法和公理。 

 

在.net
壹.一的一代,还未有TransactionScope类,由此不少有关业务的处理,都付出了SqlTransaction和SqlConnection,各类Transaction是依照各个Connection的。那种规划对于超越多少个程序集或许几个情势的事情行为的话,不是万分好,需求把作业和数据库连接作为参数字传送入。

在.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的选取方法,已经它的分子方法和属性,能够查阅 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的时候才能算真的成功。

金沙注册送58 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.  

    }

金沙注册送58 2

能够看看,他们的事体id是差别等的。

 

 

TransactionScopeOption的属性值:

 

金沙注册送58 3

金沙注册送58 4

金沙注册送58 5

对于四个例外服务器之间的数据库操作,TransactionScope依赖DTC(Distributed
Transaction Coordinator)服务做到工作1致性。

唯独对于单一服务器数据,TransactionScope的机制则相比较复杂。首要用的的是线程静态天性。线程静态性情ThreadStaticAttribute让CL福特Explorer知道,它标志的静态字段的存取是借助当前线程,而独立于任何线程的。既然存款和储蓄在线程静态字段中的数据只对存储该数量的同1线程中所运转的代码可知,那么,可利用此类字段将别的数据从3个主意传递到该第多少个章程所调用的别样格局,而且完全不用担心别的线程会破坏它的劳作。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
二.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都以同四个。并且,只有当二个TransactionScope都complete的时候才能算真的打响。

金沙注册送58 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();
            }
        }

金沙注册送58 7

可以见到,他们的业务id是不一致的。

TransactionScopeOption设为Suppress则为废除当前区块的事体,一般很少使用。

对此四个不一样服务器之间的数据库操作,TransactionScope注重DTC(Distributed
Transaction Coordinator)服务做到作业1致性。

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

Wrox出版的《Professional C# 4 and .NET
四》也有关于TransactionScope的片段应用办法的介绍。

在.net
壹.①的一时半刻,还不曾TransactionScope类,因而不少关于业务的拍卖,都交由了SqlTransaction和SqlConnection,各类Transaction是基于每种Connection的。那种布署对于超越八个程序集也许三个法子的事务行为来说,不是非凡好,必要把业务和数据库连接作为参数字传送入。

在.net
一.一的临时,还并未有TransactionScope类,由此不少关于业务的拍卖,都付出了SqlTransaction和SqlConnection,每一种Transaction是基于每一个Connection的。这种安顿对于当先两个程序集或许几个点子的作业行为来说,不是至极好,供给把业务和数据库连接作为参数字传送入。

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

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

金沙注册送58 ,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都是同一个。并且,只有当二个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();
            }
        }

金沙注册送58 8

  

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

当嵌套类的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.RequiresNew))
                {
                    Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
                    t.ADD();
                    ts2.Complete();
                }
              ts.Complete();
            }
        }

金沙注册送58 9

金沙注册送58 10

若果把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)服务做到工作一致性。

金沙注册送58 11

只是对于单1服务器数据,TransactionScope的建制则比较复杂。首要用的的是线程静态天性。线程静态特性ThreadStaticAttribute让CLOdyssey知道,它标志的静态字段的存取是依靠当前线程,而独自于别的线程的。既然存款和储蓄在线程静态字段中的数据只对存储该多少的同1线程中所运维的代码可知,那么,可利用此类字段将别的数据从三个办法传递到该第3个章程所调用的其他格局,而且完全不用担心其余线程会破坏它的劳作。TransactionScope
会将如今的 Transaction 存储到线程静态字段中。当稍后实例化 SqlCommand
时(在此 TransactionScope 从线程局地存款和储蓄中去除此前),该 SqlCommand
会检查线程静态字段以搜寻现有 Transaction,若是存在则列入该 Transaction
中。通过那种格局,TransactionScope 和 SqlCommand
能够协同工作,从而开发职员不必将 Transaction 展现传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand
所使用的体制卓殊复杂。具体可以参考文章

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

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

TransactionScopeOption设为Suppress则为废除当前区块的事情,1般很少使用。

 

对于八个不等服务器之间的数据库操作,TransactionScope信赖DTC(Distributed
Transaction Coordinator)服务做到业务一致性。

如若你认为文章有用,也可以给水发个微信小额红包鼓励鼓励!!!

只是对于单一服务器数据,TransactionScope的编写制定则相比复杂。首要用的的是线程静态性格。线程静态脾性ThreadStaticAttribute让CLRubicon知道,它标志的静态字段的存取是依靠当前线程,而独自于任何线程的。既然存款和储蓄在线程静态字段中的数据只对存款和储蓄该多少的同壹线程中所运维的代码可知,那么,可使用此类字段将其余数据从2个主意传递到该首个情势所调用的别样措施,而且完全不用担心其余线程会破坏它的劳作。TransactionScope
会将日前的 Transaction 存款和储蓄到线程静态字段中。当稍后实例化 SqlCommand
时(在此 TransactionScope 从线程局地存储中删除此前),该 SqlCommand
会检查线程静态字段以搜寻现有 Transaction,纵然存在则列入该 Transaction
中。通过那种艺术,TransactionScope 和 SqlCommand
能够协同工作,从而开发职员不必将 Transaction 显示传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand
所使用的建制11分复杂。具体能够参考文章 

金沙注册送58 12

Wrox出版的《Professional C# 四 and .NET
四》也有关于TransactionScope的有些选取办法的牵线。

相关文章

网站地图xml地图