3

啊!!!

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

文档建议指定 using SharedDbConnectionScope 包裹在 using TransactionScope ...

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

然后这里的其他问题,例如Subsonic: Using SharedDbConnectionScope with TransactionScope 似乎被破坏了表明文档是错误的,这两个对象应该是相反的......

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 重载和测试的源是否与实际正确的方式保持一致?

4

2 回答 2

4

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

于 2009-08-25T12:36:11.283 回答
0

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

于 2009-09-04T14:50:50.793 回答