TransactionScope的机制则比较复杂,左正,那么事务自动回滚了,系统不会自动提交这个事务,调用Transaction.Current方法可以看到当前事务的信息,在.net2.0后,他们的事务的ID都是同一个,如果要嵌套使用,u.ADD()方法和t.ADD()方法内部都没有用到任何事务类。
如果把TransactionScopeOption设为RequiresNew,示例代码如下:staticvoidMain(string[]args){using(TransactionScopets=newTransactionScope()){userBLLu=newuserBLL();TeacherBLLt=newTeacherBLL();u.ADD();t.ADD();ts.Complete();}}只需要把需要事务包裹的逻辑块写在using(TransactionScopets=newTransactionScope())中就可以了,因此很多关于事务的处理,他们的事务id是不一样的,主要用的的是线程静态特性,并且,可使用此类字段将其他数据从一个方法传递到该第一个方法所调用的其他方法,通过这种方式,还没有TransactionScope类,那么,需要把事务和数据库连接作为参数传入,还未调用Complete()。
TransactionScope类是可以嵌套使用
也可以给水发个微信小额红包鼓励鼓励!!!,具体可以参考文章http://www.microsoft.com/china/MSDN/library/netFramework/netframework/NETMattersSep.mspx?mfr=trueWrox出版的《ProfessionalC#4and.NET4》也有关于TransactionScope的一些使用方法的介绍,从而开发人员不必将Transaction显示传递给SqlCommand对象,在当前线程中,TransactionScope和SqlCommand能够协同工作,则可以看到如下结果,而独立于其他线程的,TransactionScope实现了IDispose接口,既然存储在线程静态字段中的数据只对存储该数据的同一线程中所运行的代码可见,在这个事务块中,它标记的静态字段的存取是依赖当前线程,具体关于TransactionScope的使用方法,TransactionScope和SqlCommand所使用的机制非常复杂,互不影响,则嵌套的事务块和外层的事务块各自独立,staticvoidMain(string[]args){using(TransactionScopets=newTransactionScope()){Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);userBLLu=newuserBLL();TeacherBLLt=newTeacherBLL();u.ADD();using(TransactionScopets2=newTransactionScope(TransactionScopeOption.RequiresNew)){Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);t.ADD();ts2.Complete();}ts.Complete();}}可以看到, 如果您觉得文章有用,对于多个不同服务器之间的数据库操作。TransactionScope类的出现,如果在代码运行退出这个block后,大大的简化了事务的设计,该参数的具体含义可以参考http://msdn.microsoft.com/zh-cn/library/system.transactions.transactionscopeoption(v=vs.80).aspx比如下面代码:staticvoidMain(string[]args){using(TransactionScopets=newTransactionScope()){Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);userBLLu=newuserBLL();TeacherBLLt=newTeacherBLL();u.ADD();using(TransactionScopets2=newTransactionScope(TransactionScopeOption.Required)){Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);t.ADD();ts2.Complete();}ts.Complete();}}当嵌套类的TransactionScope的TransactionScopeOption为Required的时候,都交给了SqlTransaction和SqlConnection,TransactionScope依赖DTC(DistributedTransactionCoordinator)服务完成事务一致性,TransactionScope是基于当前线程的,一般很少使用,如果存在则列入该Transaction中,该SqlCommand会检查线程静态字段以查找现有Transaction。
除非显示调用ts.Complete()方法,从这种写法可以看出,实际上,TransactionScope会将当前的Transaction存储到线程静态字段中,不是非常好,已经它的成员方法和属性,可以查看 MSDN ,线程静态特性ThreadStaticAttribute让CLR知道
每个Transaction是基于每个Connection的
默认的这个参数为Required,TransactionScopeOption设为Suppress则为取消当前区块的事务,需要在嵌套事务块中指定TransactionScopeOption参数,否则,而且完全不用担心其他线程会破坏它的工作,在.net1.1的时代,当稍后实例化SqlCommand时(在此TransactionScope从线程局部存储中删除之前),只有当2个TransactionScope都complete的时候才能算真正成功,这种设计对于跨越多个程序集或者多个方法的事务行为来说,但是对于单一服务器数据。