Subsonic SubSection2.2 SharedDbConnectionScope和TransactionScope事务混淆

Subsonic SubSection2.2 SharedDbConnectionScope和TransactionScope事务混淆,subsonic,transactions,subsonic2.2,shareddbconnectionscope,Subsonic,Transactions,Subsonic2.2,Shareddbconnectionscope,啊 围绕SharedDbConnectionScope和TransactionScope对象,似乎有点混乱,以便能够在事务中包装您的亚音速查询 文档建议指定围绕using TransactionScope的using SharedDbConnectionScope using(SharedDbConnectionScope scope = new SharedDbConnectionScope()) { using(TransactionScope ts = new TransactionS

围绕SharedDbConnectionScope和TransactionScope对象,似乎有点混乱,以便能够在事务中包装您的亚音速查询

文档建议指定围绕using TransactionScope的using SharedDbConnectionScope

using(SharedDbConnectionScope scope = new SharedDbConnectionScope())
{
  using(TransactionScope ts = new TransactionScope())
  {
    // do something
    ts.Complete();
  }
}
然后这里的其他问题,比如建议文档是错误的,两个对象应该是相反的

using(TransactionScope ts = new TransactionScope())
{
  using(SharedDbConnectionScope scope = new SharedDbConnectionScope())
  {
    // do something
    ts.Complete();
  }
}
但在查看源代码时,我更加困惑

在SqlQuery.cs代码文件中,它有许多ExecuteTransaction重载。例如

public static void ExecuteTransaction(List<SqlQuery> queries)
{
  using(SharedDbConnectionScope scope = new SharedDbConnectionScope())
  {
    using(TransactionScope ts = new TransactionScope())
    {
      foreach(SqlQuery q in queries)
        q.Execute();
    }
  }
}
publicstaticvoid ExecuteTransaction(列表查询)
{
使用(SharedDbConnectionScope=new SharedDbConnectionScope())
{
使用(TransactionScope ts=new TransactionScope())
{
foreach(查询中的SqlQuery q)
q、 执行();
}
}
}
嗯。。。有趣的。。。与文档匹配,但ts.Complete()调用在哪里?

该如何提交事务?就我所知,它总是会回滚。所有ExecuteTransaction重载都是一样的

但这才是真正的杀手

在TransactionWithDTCoffests.cs中,代码有一些很好的测试,只是它们以另一种方式设置了SharedDbConnectionScope和TransactionScope

using(TransactionScope ts = new TransactionScope())
{
  using(SharedDbConnectionScope connScope = new SharedDbConnectionScope())
  {
    // <snip />
  }
}
使用(TransactionScope ts=new TransactionScope())
{
使用(SharedDbConnectionScope connScope=new SharedDbConnectionScope())
{
// 
}
}
我还没有机会进行亚音速2.2的测试,但我想有人已经通过了,他们通过了

最后…

有人能给我一个关于如何在SubNic2.2中设置事务的明确答案吗?这些文件真的错了吗?ExecuteTransaction重载和测试的源是否与实际正确的方式对齐?

SharedConnectionScope(SCS)块必须位于TransactionScope(TS)内。 SCS的目的是尽可能防止将事务升级到MSDTC,因此将TS using块放在SCS using块中对我来说没有什么意义。
在任何情况下,每个TS块都必须有一个完整的()调用才能提交事务。

我个人发现,在使用SQL 2005时,SCS必须在TS中 当使用SQL2000(带有MSDTC)时,SCS必须包装TS。
我希望这有帮助……

我无法理解这个问题-这里大约有3个。我知道你很沮丧:)但我无法区分什么是混乱的,什么是错误。SharedDbConnectionScope(SDCS)和TransactionScope(TS)的顺序是混乱或错误的部分。文档状态SDC包装了TS。但这似乎不起作用。这是一个bug。ExecuteTransaction重载有SDC包装TS,因此这也是一个bug。我看不出重载实际上是在哪里提交的,但这可能是因为我没有足够仔细地查看一个bug。我看到的测试代码让TS包装了SDC。因此,从我的结论来看,这不是一个bug。混淆位是错误所在的位置。SDC和TS的顺序是错误还是SDC本身的错误和文档中的顺序正确。请注意,现在将TS包装到SDC对我来说是有效的,而SDC包装TS在应该回滚的时候是无效的。