我试图弄清楚如何在交易中正确使用 Dapper。但我仍然认为我做错了什么。我发现的所有示例都没有使用异步。

有人可以建议我如何正确地做吗?

class DapperAsyncTransaction
{
    private readonly IDbConnection _dbConnection;
    private IDbTransaction _dbTransaction;

    private IDbConnection Connection => _dbTransaction.Connection;

    /// <summary>
    /// Constructor
    /// </summary>
    /// <param name="dbConnection"></param>
    public DapperAsyncTransaction(
        IDbConnection dbConnection)
    {
        _dbConnection = dbConnection;
        _dbConnection.Open();
        _dbTransaction = _dbConnection.BeginTransaction();
    }

    public async Task Execute()
    {
        try
        {
            await Connection.ExecuteAsync(
            @"insert into Persons(Name, Surname) values" +
            "(@Name, @Surname)",
            param: new { Name = "John", Surname = "Doe" },
            transaction: _dbTransaction);


            _dbTransaction.Commit();
        }
        catch (Exception)
        {
            _dbTransaction.Rollback();
        }
        finally
        {
            _dbTransaction.Dispose();
            _dbTransaction = _dbConnection.BeginTransaction();
        }
    }
}

最佳答案

只需将您的数据库访问权限包装在启用 TransactionScopeAsyncFlowOption 的事务范围内。

public async Task AddPerson(string name, string surname)
{
   const string sql = "insert into Persons(Name, Surname) values(@Name, @Surname)";

   using (var tran = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
   using (var connection = await _connectionProvider.OpenAsync()) //Or however you get the connection
   {
     await connection.ExecuteAsync(sql, new{name, surname});
     tran.Complete();
   }
}

关于c# - Dapper 异步和事务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45860502/

10-11 23:28
查看更多