2017-08-24 51 views
1

我想弄清楚如何正确使用小巧的事务。但我仍然认为我做错了什么。我发现的所有例子都没有使用异步。小巧的异步和交易

难道有人会告诉我该怎么做对吗?

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(); 
     } 
    } 
} 
+0

解释为什么你认为这是错误的。这个例子是非常没有意义的,除非涉及到'Persons'触发器,因为你只做一个单独的操作,它已经在它自己的隐式事务中操作了(假设MSSQL) – Crowcoder

回答

1

只是在启用了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(); 
    } 
}