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