gpt4 book ai didi

c# - 无法理解 TransactionScope

转载 作者:太空宇宙 更新时间:2023-11-03 11:16:34 24 4
gpt4 key购买 nike

给定以下代码结构

func1()
{
using (TransactionScope1)
using (connection1)
{
"insert into table A"

func2()

"select from table B"
}
}

func2()
{
using (TransactionScope2)
using (connection2)
{
foreach (x in y)
{
"select from table A"
"insert into table B"
}
}
}

如果 TransactionScope2 被回滚,则 “select from table B” 失败并返回 The operation is not valid for the state of the transaction .据我了解 TransactionScope2 正在加入第一个并将它们都回滚。所以我将其更改为使用 TransactionScopeOption.RequiresNew 创建它,这反过来导致 “select from table A” 超时。

想法是让第二个事务从第一个事务读取数据,但独立提交/回滚。我的猜测是 IsolationLevel 需要以某种方式改变,但我不太了解它的选项。

编辑:如果我们将func1和2命名,也许更容易理解这个问题。基本上func2是一个DAL功能,而func1是一个单元测试它。 func1 创建一些示例数据,获取 func2 对其执行一些操作,检查结果然后回滚整个事情,而不管 func2 在哪里成功与否。

EDIT2: 阅读更多内容后,我认为下面的代码应该可以工作,但出于某种原因,我仍然在 select from table A

上超时
func1()
{
using (var txn = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
using (connection1)
{
"insert into table A"
func2()
"select from table B"
}
}

func2()
{
using (var txn = new TransactionScope(TransactionScopeOption.RequiresNew))
using (connection2)
{
foreach (x in y)
{
"select from table A"
"insert into table B"
}
}
}

最佳答案

你有一个 nested TransactionScope .

默认情况下,它们是链接在一起的,如果您不采取进一步操作 ( RequiresNew ),当内部作用域发生故障时,外部作用域将失败(回滚)。

这样他们就独立了:

func2()
{
using (TransactionScope2 =
new TransactionScope(TransactionScopeOption.RequiresNew))
using (connection2)
{
...
}
}

关于c# - 无法理解 TransactionScope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12503089/

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