Dapper 本身不管理事务,但可通过显式传入 IDbTransaction 参数在 ADO.NET 事务中执行查询与更新,需确保连接已打开、事务由该连接创建,并由开发者手动调用 Commit() 或 Rollback()。

Dapper 本身不管理事务,但可以配合 ADO.NET 的 SqlTransaction 在事务中执行查询。关键在于:**把已开启的事务显式传给 Dapper 的查询方法**。
使用 IDbTransaction 参数传入事务
Dapper 的所有查询方法(如 Query、QueryFirstOrDefault、Execute 等)都支持可选的 IDbTransaction 参数。只要传入有效的事务对象,Dapper 就会在该事务上下文中执行 SQL。
确保连接(IDbConnection)已打开,且事务由该连接开启事务对象必须是同一连接创建的,跨连接传入会抛出异常事务生命周期由你手动控制(Commit() / Rollback()),Dapper 不参与提交或回滚
典型用法示例(SQL Server)
C# 示例:
using (var connection = new SqlConnection(connectionString)){ connection.Open(); using (var transaction = connection.BeginTransaction()) { try { // 在事务中查询 var users = connection.Query( "SELECT * FROM Users WHERE Status = @status", new { status = "Active" }, transaction); // ← 关键:传入 transaction // 在事务中更新 int rows = connection.Execute( "UPDATE Orders SET Processed = 1 WHERE UserId IN @userIds", new { userIds = users.Select(u => u.Id).ToArray() }, transaction); transaction.Commit(); // 手动提交 } catch { transaction.Rollback(); // 出错时手动回滚 throw; }}
}
注意事项和常见问题
事务未提交前,其他连接默认看不到未提交的变更(取决于隔离级别)如果查询语句本身含 BEGIN TRANSACTION 或 COMMIT,可能干扰外部事务,应避免异步方法(如 QueryAsync)同样支持 IDbTransaction 参数,用法一致使用 TransactionScope 时,Dapper 会自动感知环境事务(需开启连接并调用 Open()),但显式传参更清晰可控
基本上就这些。核心就是“连接开、事务启、参数传、自己管提交”。不复杂但容易忽略传参这一步。
以上就是Dapper查询时如何指定事务 Dapper在事务中执行Query的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442857.html
微信扫一扫
支付宝扫一扫