2017-08-24 25 views
1

私は、トランザクションでDapperを正しく使用する方法を理解しようとしています。しかし、私はまだ私が何か間違っていると思う。私が見つけたすべての例は、非同期を使用していません。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(); 
     } 
    } 
} 
+0

なぜそれが間違っていると説明しますか?この例は、 'Persons'のトリガーが関与しない限り、あなた自身の暗黙的なトランザクション(MSSQLを前提としています)ですでに動作する単一の操作を行っているだけなので、 – Crowcoder

答えて

1

だけ有効TransactionScopeAsyncFlowOptionでトランザクションスコープでのDBアクセスを包みます。

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(); 
    } 
} 
関連する問題