运行 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");
我正在尝试使用 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");