Dapper如何处理事务 Dapper Transaction使用教程

来源:这里教程网 时间:2026-02-21 17:34:24 作者:

在 Dapper 中处理事务,核心就一条:把 IDbTransaction 对象传给所有需要参与事务的数据库操作方法。Dapper 本身不管理事务,而是复用 ADO.NET 的事务机制,所以必须手动控制连接状态和提交/回滚逻辑。

事务前必须打开连接

Dapper 的

BeginTransaction()
要求数据库连接已处于打开状态,否则会抛异常。这点和普通查询不同——后者可由 Dapper 自动打开/关闭连接,但事务场景下必须显式调用
Open()

✅ 正确写法:
connection.Open(); var tx = connection.BeginTransaction();
❌ 错误写法:直接对未打开的连接调用
BeginTransaction()

所有操作都要传入同一个 transaction 参数

无论是

Execute
Query
还是
QuerySingle
,只要想纳入事务范围,就必须把上一步创建的
IDbTransaction
实例通过
transaction:
参数传进去。漏传一次,该操作就游离在事务之外。

示例插入+查 ID:
connection.Execute(sqlInsert, data, tx);
紧接着查刚生成主键:
int id = connection.QuerySingle<int>("SELECT SCOPE_IDENTITY();", transaction: tx);</int>
再插入关联记录:
connection.Execute(sqlLog, logData, tx);

成功提交或失败回滚必须成对出现

事务生命周期靠

Commit()
Rollback()
控制。建议用 try-catch 包裹全部操作,正常走
Commit()
,异常时立刻
Rollback()
,避免连接挂起或数据残留。

不要只写
Commit()
却忽略异常分支
回滚后记得重新抛出异常(如
throw;
),否则上层可能误判为成功
推荐使用
using
确保 transaction 对象及时释放

跨多个表或存储过程也能统一事务

不管是原生 SQL 还是调用存储过程,只要共用同一个

IDbTransaction
,就能保证原子性。比如下单时同时更新订单表、扣减库存、写日志,全在一个事务里完成。

调用存储过程:
connection.Execute("sp_CreateOrder", param, tx, commandType: CommandType.StoredProcedure);
批量插入:
connection.Execute(sql, list, tx);
(list 是 IEnumerable)
多结果集(如查用户+查角色):
var grid = connection.QueryMultiple(sql, tx);

基本上就这些。不复杂但容易忽略细节,关键是连接要开、transaction 要传、commit/rollback 要配对。

相关推荐