哎呀!!!
围绕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重载和测试的源是否与实际正确的方式对齐?
答案 0 :(得分:4)
SharedConnectionScope(SCS)块必须位于TransactionScope(TS)内。 SCS的目的是防止事务升级到MSDTC(如果可能的话),因此在使用块的SCS中使用块对我来说没什么意义。 在任何情况下,每个TS块都必须有一个Complete()调用来提交事务。
答案 1 :(得分:0)
我个人发现在使用SQL 2005时,SCS必须在TS内部 当使用SQL 2000(使用MSDTC)时,SCS必须包装TS。 我希望这有帮助...