Dapper不直接管理事务隔离级别,需通过ADO.NET的SqlTransaction在创建事务时指定,如connection.BeginTransaction(IsolationLevel.Serializable),再将该事务传给Dapper方法执行操作。

Dapper 本身不直接管理事务隔离级别,它依赖于底层 ADO.NET 的 SqlTransaction(或其他数据库对应的 Transaction 类型)来控制隔离级别。你不能通过 Dapper 的 API 直接“设置 IsolationLevel”,而是在创建事务时指定。
在使用 Dapper 时指定事务隔离级别
关键点是:Dapper 的查询方法(如 Query、Execute)支持传入一个已开启的 IDbTransaction 实例。隔离级别必须在创建该事务时确定。
以 SQL Server 为例,常见写法如下:
- 用
connection.BeginTransaction(IsolationLevel.ReadCommitted)显式开启带隔离级别的事务 - 将该事务对象传给 Dapper 方法(如
conn.Query)(sql, param, trans) - 手动调用
trans.Commit()或trans.Rollback()
完整示例(SQL Server)
注意:连接需提前打开
using var conn = new SqlConnection(connectionString); conn.Open();// 指定隔离级别(例如 Serializable) using var trans = conn.BeginTransaction(IsolationLevel.Serializable);
try { var user = conn.QueryFirstOrDefault
( "SELECT * FROM Users WHERE Id = @id", new { id = 123 }, trans); 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 是轻量层,事务控制权始终在你手上。










