啊!好像在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重载和测试的源码是否应该根据实际正确的方式进行对齐?