0

我见过这样的代码示例,其中 TransactionScope 嵌套在另一个内部

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,它只是与外部事务合并,所以如果有什么失败,整个事情都会失败,那有什么意义呢?我在这里错过了什么吗?

编辑: 为了清楚起见,我想强调我(认为我 :-))理解的 Suppress 选项,这在 MSDN 文档中进行了解释。我的问题是关于默认的必填选项;也许我不完全理解,但是如果事务 B 嵌套在事务 A 中,那么如果 A 失败B 失败,那么 AB 都将回滚,如果我一开始就没有将 B 放入事务中,这也是一样的.

所以改写的问题是'用默认的Required选项嵌套事务有什么区别,而不是全部做?'

4

1 回答 1

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 向下侧

于 2013-02-11T19:07:39.230 回答