【发布时间】:2017-08-23 08:35:20
【问题描述】:
伙计们 - 很抱歉,我什至在 Stack 上看到了重新讨论这个话题,关于这个话题已经有很多问题了。
但我发现自己身处一个有趣的地方,希望您能提供帮助。
高级问题:SQL SERVER 是否有余地来决定应将视图包装在 ISOLATION LEVEL SNAPSHOT 中吗?
我知道这听起来像是一个疯狂的问题,但我正在尝试针对我遇到的问题用尽所有途径。
我正在使用一个运行 35 个查询以通过 Link Server 从另一个数据库检索数据的应用程序。查询是分别针对一个表的简单选择。所有DB操作均针对SQL SERVER进行,检索代码为ADO.NET/c#等
34 个查询完美运行 - 但有一个坏苹果,为此,我遇到了 事务隔离级别快照 问题。
我还在应用程序之外测试了数据检索,当我在“问题”查询中实现以下 sn-p 时,我也遇到了问题:
using (var trans = conn.BeginTransaction(IsolationLevel.Snapshot))
但是,当我在所述查询中不实现它时,一切都很好。 我还针对其他查询进行了测试 - 使用和不使用“Shapshot” - 我的结果是可预测的......使用“Shapshot”,没有查询过程......如果没有实现,所有查询都会处理......
我的结果表明应用程序负责改变数据检索策略。
根据他们的知识库,我发现了这个:Locking is handled by the database level (MS SQL Server/Oracle) and not by "us". Generally, locking is row level but the optimizer may choose something different
不幸的是,我无法访问负责数据检索的样板应用程序代码。我怀疑这个特定的查询/表有一个或多个关键词——在列或查询/表命名中——触发应用程序使用备用检索策略。根据开发者论坛,我已经询问过这种情况,我正在等待回复......
还是回到他们提到的the optimizer may choose something different- 他们的优化器,或者数据库优化器?可以设置 SQL SERVER 进行“判断调用”吗?是语句不清楚还是我对 SQL SERVER 及其功能不够了解?
我知道这似乎是一个疯狂的问题,但我真的想在这里排除所有可能的途径。 谢谢你暂停你的怀疑和幽默那个疯狂的帖子:)
【问题讨论】:
-
您在知识库中找到的引用涉及锁定技术(行级与表级)而不是隔离级别(可序列化、快照等)。应用程序必须为单个问题查询指定快照隔离级别。如果不更改代码,我认为您无法解决此问题。
-
同意 - 显然带有“评估”一词的对象(可能是因为隐含的敏感性质)导致应用程序构建事务。更改视图名称后,数据成功返回客户端。
标签: c# sql-server database transactions isolation-level