在Dapper SqlBuilder或sp_exectuesql中运行SET语句

sta*_*247 5 sql sql-server isolation-level dapper

我正在尝试使用来在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);
Run Code Online (Sandbox Code Playgroud)

但这有效:

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

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

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

exec sp_executesql N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'
Run Code Online (Sandbox Code Playgroud)

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

有什么办法可以SET在单独的地方设置交易级别(或任何其他语句).Execute?或者,也许是一种特殊的使用SET语句的方式sp_executesql

sta*_*247 4

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

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

指定事务中的隔离级别:

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

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

var readUncommitted = builder.AddTemplate("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
var readCommitted = builder.AddTemplate("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
Run Code Online (Sandbox Code Playgroud)