SubSonic2.2共享数据库连接范围和TransactionScope事务混淆

3

啊!好像在SharedDbConnectionScope和TransactionScope对象上存在一些混淆,用于在事务中包装SubSonic查询。

文档建议在使用TransactionScope的同时,将其包装在SharedDbConnectionScope中...

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

然后,其他类似的问题,例如Subsonic: 使用 SharedDbConnectionScope 和 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重载和测试的源码是否应该根据实际正确的方式进行对齐?


我无法理解这个问题 - 这里大约有3个问题。我知道你很沮丧 :) 但我无法确定哪些是困惑的,哪些是你认为是错误的。 - user1151
SharedDbConnectionScope (SDCS)和TransactionScope (TS)的顺序是令人困惑或有问题的部分。文档中说明SDCS包装了TS。但是这似乎不起作用,所以这是一个错误。ExecuteTransaction的重载函数中,SDCS包装了TS,因此也是一个错误。我没有看到重载函数实际上是在哪里提交的,但这可能是因为我没有找得够仔细,而不是一个错误。我查看的测试代码中,TS包装了SDCS。所以我得出结论,这不是一个错误。错误发生的地方是令人困惑的部分。 - BlackMael
SDCS和TS的顺序是错误的还是SDCS本身存在错误,文档中的顺序是正确的?目前来看,将TS包装在SDCS周围对我有用,而将SDCS包装在TS周围在回滚时不起作用。 - BlackMael
2个回答

4

SharedConnectionScope(SCS)块必须在TransactionScope(TS)内部。 SCS的目的是尽可能避免升级事务到MSDTC,因此在SCS using块中使用TS using块对我来说意义不大。 无论如何,每个TS块都必须调用Complete()函数以提交事务。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接