gpt4 book ai didi

sql - 在 Dapper SqlBuilder 或 sp_exectuesql 中运行 SET 语句

转载 作者:行者123 更新时间:2023-12-02 23:52:14 35 4
gpt4 key购买 nike

我尝试使用 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 以检查我的连接,但它仍然显示 ReadCommissed,这是我的数据库中的默认隔离级别。

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

最佳答案

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

关于sql - 在 Dapper SqlBuilder 或 sp_exectuesql 中运行 SET 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50239304/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com