当在嵌套的TransactionScope中使用Dapper时,SqlConnection.OpenAsync会抛出 "该操作对事务状态无效 "的错误。

问题描述 投票:0回答:1

我正在使用Dapper扩展方法与我的SqlConnection交互。

我有一个嵌套的事务。我在内部事务中执行了一些SQL。然后,在我回滚我的内部事务之后,我仍然需要在外部事务里面执行一些SQL。此时--当我使用Dapper在外层事务内部执行一些SQL时,Dapper扩展方法抛出了一个System.Transactions.TransactionException,消息是 "该操作对事务的状态无效"。看堆栈跟踪,我看到异常是从SqlConnection.OpenAsync抛出的。

这是我的代码。

public async Task DoesNotWork()
{
    const string insertSql =
        "INSERT INTO Table_Foo " +
        "(Bar, Baz, Bap) " +
        "VALUES ('test', 0, 0);";
    const string getSql =
        "SELECT * FROM Table_Foo;";

    using (var conn = new SqlConnection(_connString))
    {
        using (var outer = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
        {
            using (var inner = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
            {
                await conn.ExecuteAsync(insertSql);
                var newState = await conn.QueryAsync(getSql);
                if (isValid(newState))
                {
                    inner.Complete();
                }
            }
            var finalState = await conn.QueryAsync(getSql); // the exception is thrown from here
            // do some work on finalState
        }
    }
}

private static bool isValid(IEnumerable<dynamic> newState)
{
    // simplified for the sake of example
    return false;
}

为什么这个异常会被抛出?我想做的就是使用嵌套事务。

c# .net dapper
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.