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

11次阅读

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

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

Dapper 本身不直接管理事务隔离级别,它依赖于底层 ADO.NET 的 SqlTransaction(或其他数据库对应的 Transaction 类型)来控制隔离级别。你不能通过 Dapper 的 API 直接“设置 IsolationLevel”,而是在创建事务时指定。

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

关键点是:Dapper 的查询方法(如 QueryExecute)支持传入一个已开启的 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 是轻量层,事务控制权始终在你手上。

text=ZqhQzanResources