使用默认的Required选项嵌套Transaction并且不执行所有操作之间有什么区别?

时间:2013-02-11 17:53:34

标签: c# transactionscope

我见过代码示例,其中TransactionScope嵌套在另一个内,如this

using(TransactionScope scope1 = new TransactionScope())
{
     try
     {
          //Start of non-transactional section 
          using(TransactionScope scope2 = new
             TransactionScope(TransactionScopeOption.Suppress))
          {
               //Do non-transactional work here
          }
          //Restores ambient transaction here
   }
     catch
     {}
   //Rest of scope1
}

我可以在这里理解Supress的使用,但据我所知Required只是与外部事务合并,所以如果有什么失败,整个事情都会失败,那么重点是什么?我在这里错过了什么吗?

修改 为了清楚起见,我想强调抑制选项I(想想我:-))理解,这在MSDN文档中有解释。我的问题是默认必需选项;也许我不完全理解,但如果交易B嵌套在交易A中,那么如果A失败 B失败,那么A B都将被回滚,这是如果我从来没有把B放在交易中那么一样。

所以重写的问题是'使用默认的必需选项嵌套交易有什么区别,而不是全部执行?'

1 个答案:

答案 0 :(得分:0)

想一想:

using(TransactionScope scope1 = new TransactionScope())
{
     //i insert some records in tabe A
     try
     {              
          using(TransactionScope scope2 = new
             TransactionScope(TransactionScopeOption.Suppress))
          {                  
               // I insert some records in table B
               scope2.Complete() 
          }
          //I insert some records in table C
   }
     catch
     {}
   //I Update some records in table D
   //I Delete some records of table E
   // Here we have an exception being thrown                       
 scope1.Complete() 
}

运行代码后 表A,C,D,E的所有更改都将回滚
表B的所有更改都将提交

TrnsactionScop Down side