首页 > 解决方案 > 在 Dapper SqlBuilder 或 sp_exectuesql 中运行 SET 语句

问题描述

我正在尝试使用在 Dapper 中设置事务隔离级别SqlBuilder,但似乎没有用。

var builder = new SqlBuilder();
var sqlStatement = builder.AddTemplate(@"
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    SELECT * FROM Users
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
conn.Query<User>(sqlStatement.RawSql);

但这有效:

conn.Execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
var result = conn.Query<User>(sqlStatement);
conn.Execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");

我想这可能是因为SqlBuilderDapper 构建了一个动态 SQL 并使用sp_executesql存储过程执行。

为了证明我的假设,我确实尝试了以下 SQL 语句:

exec sp_executesql N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'

在那句话之后,我询问sys.dm_exec_sessions检查我的连接,它仍然显示ReadCommitted我的数据库中的默认隔离级别。

有什么办法可以SET单独设置事务级别(或任何其他语句).ExecuteSET或者也许是一种使用语句的特殊方式sp_executesql

标签: sqlsql-serverdapperisolation-level

解决方案


经过另一次测试,我在这里给出的示例似乎有效。我认为它必须执行我们的生产 SQL 查询。

我们确实找到了其他几种方法来运行它。

在事务中指定隔离级别:

using (var trans = conn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted))
{
    conn.Query<User>(sqlStatement.RawSql, transaction: trans).Dump();
}

在构建器模板中添加隔离级别:

var readUncommitted = builder.AddTemplate("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
var readCommitted = builder.AddTemplate("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");

推荐阅读