Dapper 异步和事务
Dapper async and transaction
我正在尝试弄清楚如何在交易中正确使用 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();
}
}
我正在尝试弄清楚如何在交易中正确使用 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();
}
}