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