三个漏洞非常多的掌握正是Complete()方法是付诸业务的

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.  

    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让CL安德拉知道,它标记的静态字段的存取是凭仗当前线程,而独自于别的线程的。既然存款和储蓄在线程静态字段中的数据只对存储该多少的同一线程中所运维的代码可以知道,那么,可利用此类字段将此外数据从三个艺术传递到该第二个主意所调用的任何格局,并且完全不用顾忌别的线程会损坏它的职业。TransactionScope
会将如今的 Transaction 存储到线程静态字段中。当稍后实例化 SqlCommand
时(在这里 TransactionScope 从线程局地存款和储蓄中去除在此之前),该 SqlCommand
会检查线程静态字段以搜寻现存 Transaction,假使存在则列入该 Transaction
中。通过这种方式,TransactionScope 和 SqlCommand
能够协同工作,进而开采人士不一定会将 Transaction 显示传递给 SqlCommand
对象。实际上,TransactionScope 和 SqlCommand 所使用的体制特别复杂。

相关文章

发表评论

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

*
*
Website