Dapper异步事务需显式使用ADO.NET的BeginTransactionAsync创建事务,并将同一SqlTransaction实例传给所有Dapper异步方法(如ExecuteAsync、QueryAsync),最后调用CommitAsync或RollbackAsync完成控制。

Dapper 本身不直接管理事务,它依赖 ADO.NET 的 SqlTransaction(或其他数据库对应的 Transaction 类型)来实现事务控制。所谓“Dapper 异步事务”,其实是使用支持异步的 ADO.NET API(如 BeginTransactionAsync、CommitAsync、RollbackAsync)配合 Dapper 的异步方法(如 ExecuteAsync、QueryAsync)来完成——关键在于把同一个 SqlTransaction 实例显式传给每个 Dapper 调用。
在打开连接后,调用 connection.BeginTransactionAsync() 获取事务对象。注意:必须确保连接已打开(Dapper 不会自动帮你打开),且事务生命周期与连接绑定。
OpenAsync(),否则抛异常Dapper 的异步方法(如 ExecuteAsync、QueryFirstOrDefaultAsync)都有重载支持传入 IDbTransaction。漏传就等于没走事务——它会走默认的自动提交模式。
conn.ExecuteAsync(sql, param, transaction)
conn.ExecuteAsync(sql, param)(脱离事务上下文)事务结束后,必须显式调用 transaction.CommitAsync() 或 transaction.RollbackAsync()。推荐用 try/catch 包裹业务逻辑,出异常时回滚。
using 或 try/finally 确保事务终态被处理(注意:实际项目中建议封装为 service 方法或使用 UnitOfWork 模式)
using var conn = new SqlConnection(connectionString);
await conn.OpenAsync();
<p>using var transaction = await conn.BeginTransactionAsync();</p><p>try
{
await conn.ExecuteAsync("INSERT INTO Orders (...) VALUES (...)", order, transaction);
await conn.ExecuteAsync("UPDATE Products SET Stock = Stock - @Qty WHERE Id = @Pid", stockParam, transaction);</p><pre class="brush:php;toolbar:false;">await transaction.CommitAsync();} catch { await transaction.RollbackAsync(); throw; }
基本上就这些。Dapper 异步事务不是魔法,核心就是「一个连接 + 一个开启的异步事务 + 所有操作显式传参 + 显式提交或回滚」。不复杂但容易忽略 transaction 参数传递这一步。
以上就是Dapper怎么实现异步事务 Dapper异步Transaction用法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号