中回滚TransactionScope的运用办法和法则,中TransactionScope的行使格局和公理

TransactionScope只要三个操作失利,它会自动回滚,Complete表示事情完毕

 

现实上,三个破绽百出的知晓正是Complete()方法是交给业务的,那是大错特错的,事实上,它的效果的表示本作业实现,它一般位于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. 中回滚TransactionScope的运用办法和法则,中TransactionScope的行使格局和公理。 

    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都是同一个。并且,唯有当3个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致性。

只是对于单1服务器数据,TransactionScope的机制则相比较复杂。首要用的的是线程静态性情。线程静态特性ThreadStaticAttribute让CL奥迪Q5知道,它标志的静态字段的存取是正视当前线程,而独立于别的线程的。既然存款和储蓄在线程静态字段中的数据只对存款和储蓄该数据的同一线程中所运维的代码可知,那么,可选拔此类字段将此外数据从三个措施传递到该第三个主意所调用的其它方法,而且完全不用担心此外线程会毁掉它的工作。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的时候才能算真的打响。

亚洲必赢官网 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)服务到位业务1致性。

只是对于单一服务器数据,TransactionScope的体制则相比复杂。重要用的的是线程静态天性。线程静态个性ThreadStaticAttribute让CL陆风X捌知道,它标志的静态字段的存取是凭借当前线程,而单身于其余线程的。既然存款和储蓄在线程静态字段中的数据只对存款和储蓄该数额的同壹线程中所运维的代码可知,那么,可采纳此类字段将别的数据从2个办法传递到该第二个办法所调用的别的办法,而且完全不用担心其它线程会损坏它的办事。TransactionScope
会将近来的 Transaction 存款和储蓄到线程静态字段中。当稍后实例化 SqlCommand
时(在此 TransactionScope 从线程局地存款和储蓄中删除以前),该 SqlCommand
会检查线程静态字段以搜寻现有 Transaction,如若存在则列入该 Transaction
中。通过那种措施,TransactionScope 和 SqlCommand
能够协同工作,从而开发职员不必将 Transaction 显示传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand
所使用的体制非常复杂。具体可以参考文章

亚洲必赢官网 ,Wrox出版的《Professional C# 四 and .NET
四》也有关于TransactionScope的部分使用办法的牵线。

在.net
一.一的1世,还尚无TransactionScope类,因而不少关于业务的处理,都交由了SqlTransaction和SqlConnection,每一种Transaction是基于每一种Connection的。那种设计对于超过八个程序集恐怕四个方法的作业行为的话,不是尤其好,须要把事情和数据库连接作为参数字传送入。

在.net
一.一的壹世,还不曾TransactionScope类,由此不少关于业务的处理,都交由了SqlTransaction和SqlConnection,每种Transaction是基于种种Connection的。那种设计对于超过三个程序集或然多少个点子的事体行为的话,不是12分好,需求把业务和数据库连接作为参数字传送入。

在.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。

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

亚洲必赢官网 8

  

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

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

亚洲必赢官网 9

亚洲必赢官网 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)服务到位业务1致性。

亚洲必赢官网 11

只是对于单1服务器数据,TransactionScope的体制则相比较复杂。首要用的的是线程静态个性。线程静态性格ThreadStaticAttribute让CLLAND知道,它标志的静态字段的存取是借助当前线程,而单身于别的线程的。既然存款和储蓄在线程静态字段中的数据只对存储该数量的同一线程中所运营的代码可见,那么,可应用此类字段将别的数据从一个方法传递到该第1个艺术所调用的其它艺术,而且完全不用担心其余线程会损坏它的办事。TransactionScope
会将日前的 Transaction 存款和储蓄到线程静态字段中。当稍后实例化 SqlCommand
时(在此 TransactionScope 从线程局地存款和储蓄中去除从前),该 SqlCommand
会检查线程静态字段以寻找现有 Transaction,假如存在则列入该 Transaction
中。通过那种方式,TransactionScope 和 SqlCommand
能够协同工作,从而开发人士不必将 Transaction 展现传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand
所使用的体制万分复杂。具体能够参照小说

能够看来,他们的事情id是不均等的。

Wrox出版的《Professional C# 肆 and .NET
四》也有关于TransactionScope的有的用到格局的牵线。

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

 

对此五个不相同服务器之间的数据库操作,TransactionScope信赖DTC(Distributed
Transaction Coordinator)服务到位作业①致性。

比方您觉得小说有用,也足以给水发个微信小额红包鼓励鼓励!!!

只是对于单1服务器数据,TransactionScope的体制则相比复杂。首要用的的是线程静态个性。线程静态特性ThreadStaticAttribute让CLRubicon知道,它标志的静态字段的存取是凭借当前线程,而单身于其余线程的。既然存款和储蓄在线程静态字段中的数据只对存款和储蓄该数额的同一线程中所运维的代码可见,那么,可使用此类字段将别的数据从二个办法传递到该首个办法所调用的别的措施,而且完全不用担心其它线程会损坏它的办事。TransactionScope
会将近期的 Transaction 存储到线程静态字段中。当稍后实例化 SqlCommand
时(在此 TransactionScope 从线程局地存款和储蓄中剔除以前),该 SqlCommand
会检查线程静态字段以搜寻现有 Transaction,若是存在则列入该 Transaction
中。通过那种艺术,TransactionScope 和 SqlCommand
能够协同工作,从而开发人士不必将 Transaction 彰显传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand
所使用的体制分外复杂。具体能够参考小说 

亚洲必赢官网 12

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

网站地图xml地图