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 调用。
1. 使用 BeginTransactionAsync 创建异步事务
在打开连接后,调用 connection.BeginTransactionAsync() 获取事务对象。注意:必须确保连接已打开(Dapper 不会自动帮你打开),且事务生命周期与连接绑定。
- 连接需手动
OpenAsync(),否则抛异常 - 事务对象要保存下来,后续所有 Dapper 操作都需传入它
- 不要在 using 块里提前释放连接或事务,否则可能引发“连接已关闭”错误
2. 所有 Dapper 异步操作必须显式传入 transaction 参数
Dapper 的异步方法(如 ExecuteAsync、QueryFirstOrDefaultAsync)都有重载支持传入 IDbTransaction。漏传就等于没走事务——它会走默认的自动提交模式。
- 正确写法:
conn.ExecuteAsync(sql, param, transaction) - 错误写法:
conn.ExecuteAsync(sql, param)(脱离事务上下文) - 多个操作共用同一个 transaction 实例,才能保证原子性
3. 手动控制 CommitAsync / RollbackAsync
事务结束后,必须显式调用 transaction.CommitAsync() 或 transaction.RollbackAsync()。推荐用 try/catch 包裹业务逻辑,出异常时回滚。
还木有评论哦,快来抢沙发吧~