Dapper如何处理数据库事务隔离级别 Dapper设置IsolationLevel方法

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

Dapper 本身不直接管理事务隔离级别,它依赖于底层 ADO.NET 的

SqlTransaction
(或其他数据库对应的 Transaction 类型)来控制隔离级别。你不能通过 Dapper 的 API 直接“设置 IsolationLevel”,而是在创建事务时指定。

在使用 Dapper 时指定事务隔离级别

关键点是:Dapper 的查询方法(如

Query<t></t>
Execute
)支持传入一个已开启的
IDbTransaction
实例。隔离级别必须在创建该事务时确定。

以 SQL Server 为例,常见写法如下:

connection.BeginTransaction(IsolationLevel.ReadCommitted)
显式开启带隔离级别的事务
将该事务对象传给 Dapper 方法(如
conn.Query<user>(sql, param, trans)</user>
手动调用
trans.Commit()
trans.Rollback()

完整示例(SQL Server)

注意:连接需提前打开

using var conn = new SqlConnection(connectionString);
conn.Open();
<p>// 指定隔离级别(例如 Serializable)
using var trans = conn.BeginTransaction(IsolationLevel.Serializable);</p><p>try
{
var user = conn.QueryFirstOrDefault<User>(
"SELECT * FROM Users WHERE Id = @id", 
new { id = 123 }, 
trans);</p><pre class="brush:php;toolbar:false;">conn.Execute("UPDATE Users SET Name = @name WHERE Id = @id", 
    new { name = "Alice", id = 123 }, 
    trans);
trans.Commit();

} catch { trans.Rollback(); throw; }

常见隔离级别说明(SQL Server)

不同

IsolationLevel
值影响并发行为和数据一致性:

ReadUncommitted:允许脏读,性能高但风险大 ReadCommitted(默认):阻止脏读,语句级快照 RepeatableRead:防止不可重复读,锁住读取的行直到事务结束 Serializable:最高级别,防止幻读,可能大幅降低并发性 Snapshot:需数据库启用
ALLOW_SNAPSHOT_ISOLATION
,基于行版本控制

注意事项

事务隔离级别是连接/会话级别的设置,只对当前事务生效。Dapper 不提供全局或会话级隔离级别配置——它完全交由 ADO.NET 处理。

如果你用的是

TransactionScope
(比如在 .NET Framework 中),则需通过
TransactionOptions.IsolationLevel
设置,并确保 Dapper 使用的是同一个环境事务(即不传入显式 transaction 参数,让 Dapper 自动参与 ambient transaction)。

基本上就这些。Dapper 是轻量层,事务控制权始终在你手上。

相关推荐