SubSonic2.2 SharedDbConnectionScope和TransactionScope事务混淆

时间:2009-08-25 12:08:55

标签: subsonic transactions subsonic2.2 shareddbconnectionscope

哎呀!!!

围绕SharedDbConnectionScope和TransactionScope对象似乎有点混淆,以便在事务中包装SubSonic查询。

文档建议使用TransactionDcope指定使用SharedDbConnectionScope ...

using(SharedDbConnectionScope scope = new SharedDbConnectionScope())
{
  using(TransactionScope ts = new TransactionScope())
  {
    // do something
    ts.Complete();
  }
}

然后这里的其他问题,例如Subsonic: Using SharedDbConnectionScope together with TransactionScope seems to be broken表明文档是错误的,两个对象应该是相反的...

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();
    }
  }
}

嗯......有趣......匹配文档,但...... ts.Complete()调用在哪里?

这应该如何提交交易?据我所知,它总是会回滚。所有ExecuteTransaction重载都是一样的!

但这是真正的踢球者......

在TransactionWithDtcOffTests.cs代码中有一些不错的测试,除了他们已经设置了SharedDbConnectionScope和TransactionScope的另一种方式!

using(TransactionScope ts = new TransactionScope())
{
  using(SharedDbConnectionScope connScope = new SharedDbConnectionScope())
  {
    // <snip />
  }
}

我没有机会为SubSonic 2.2运行测试,但我认为有人已经通过了测试...

最后...

有人可以给我一个关于如何设置SubSonic2.2中的交易的明确答案吗?文档确实是错的吗? ExecuteTransaction重载和测试的源是否与实际正确的方式对齐?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

我个人发现在使用SQL 2005时,SCS必须在TS内部 当使用SQL 2000(使用MSDTC)时,SCS必须包装TS。 我希望这有帮助...