我正在使用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;
}
为什么这个异常会被抛出?我想做的就是使用嵌套事务。