小巧的异步和交易
问题描述:
我想弄清楚如何正确使用小巧的事务。但我仍然认为我做错了什么。我发现的所有例子都没有使用异步。小巧的异步和交易
难道有人会告诉我该怎么做对吗?
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();
}
}
解释为什么你认为这是错误的。这个例子是非常没有意义的,除非涉及到'Persons'触发器,因为你只做一个单独的操作,它已经在它自己的隐式事务中操作了(假设MSSQL) – Crowcoder