2

给定以下代码结构

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需要以某种方式改变,但我并不真正理解它的选项。

编辑: 如果我们将 and 命名为 2,也许更容易理解问题func1。基本上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"
        }
    }
}
4

2 回答 2

2

你有一个嵌套的 TransactionScope

默认情况下,它们是链接的,无需您采取进一步的行动(RequiresNew),当内部范围发生时,外部范围将失败(回滚)。

这样他们将是独立的:

func2()
{
    using (TransactionScope2 = 
         new TransactionScope(TransactionScopeOption.RequiresNew)) 
    using (connection2)
    {
       ...
    }
}
于 2012-09-19T22:13:26.040 回答
0

试试IsolationLevel.ReadUncommitted

于 2012-09-19T21:29:45.993 回答