Dapper查询时如何指定事务 Dapper在事务中执行Query

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

Dapper 本身不管理事务,但可以配合 ADO.NET 的

SqlTransaction
在事务中执行查询。关键在于:**把已开启的事务显式传给 Dapper 的查询方法**。

使用 IDbTransaction 参数传入事务

Dapper 的所有查询方法(如

Query<t></t>
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<User>(
                "SELECT * FROM Users WHERE Status = @status", 
                new { status = "Active" }, 
                transaction); // ← 关键:传入 transaction
<pre class="brush:php;toolbar:false;">        // 在事务中更新
        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()
),但显式传参更清晰可控

基本上就这些。核心就是“连接开、事务启、参数传、自己管提交”。不复杂但容易忽略传参这一步。

相关推荐