运行 Dapper SqlBuilder 中的 SET 语句或 sp_exectuesql

Run SET Statement in Dapper SqlBuilder or sp_exectuesql

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

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");

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

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

exec sp_executesql N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'

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

有什么方法可以绕过在单独的 .Execute 中设置事务级别(或任何其他 SET 语句)?或者在 sp_executesql?

中使用 SET 语句的特殊方式

试试这个:

SELECT * FROM Users with (nolock)

与在执行select语句之前使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED相同。

更多关于:WITH(NOLOCK)

经过另一次测试,我在这里给出的示例似乎可以正常工作。我认为它必须执行我们的生产 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");