gpt4 book ai didi

SubSonic2.2 SharedDbConnectionScope 和 TransactionScope 事务混淆

转载 作者:行者123 更新时间:2023-12-02 19:41:17 25 4
gpt4 key购买 nike

哎呀!!!

围绕 SharedDbConnectionScope 和 TransactionScope 对象似乎有点困惑,以便在事务中包装 SubSonic 查询。

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

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

最佳答案

SharedConnectionScope (SCS) block 必须位于 TransactionScope (TS) 内。SCS 的目的是在可能的情况下防止将事务升级到 MSDTC,因此将 TS using block 放在 SCS using block 内对我来说没有什么意义。无论如何,每个 TS block 都必须有一个 Complete() 调用才能提交事务。

关于SubSonic2.2 SharedDbConnectionScope 和 TransactionScope 事务混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1327871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com