sql - 在 Dapper SqlBuilder 或 sp_exectuesql 中运行 SET 语句
问题描述
我正在尝试使用在 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);
但这有效:
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
我的数据库中的默认隔离级别。
有什么办法可以SET
单独设置事务级别(或任何其他语句).Execute
?SET
或者也许是一种使用语句的特殊方式sp_executesql
?
解决方案
经过另一次测试,我在这里给出的示例似乎有效。我认为它必须执行我们的生产 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");
推荐阅读
- python - 如何从flask socketio中的线程发射到某个套接字?
- blockchain - 对solidity代码运行测试时出错
- mysql - MySQL - 在子查询中获取多行
- javascript - 什么是 Chrome 扩展的首选实现,它可以捕获并读取一个特定网页上新添加的列表值?
- python - 太空入侵者杀死多个敌人
- php - Stripe 在 PHP 中创建多个阶段
- html - SVG/Inkscape - “无法加载请求的文件”
- python - 为什么输出最后一直返回“无”值?
- c# - 如何添加到自定义列表视图用户控制编辑项目列组等任务?
- python - 向 nifti 文件添加维度