Joh*_*ohn 8 linq sql-server entity-framework nolock isolation-level
我们正在评估EF4,我的DBA说我们必须在所有SELECT语句中使用NOLOCK提示.所以我正在研究如何在使用EF4时实现这一点.
我已经阅读了关于如何在EF4中实现这一点的不同想法,但所有这些似乎都是一种解决方案而不是微软或EF4批准的.在使用LINQ-to-SQL/LINQ-to-Entities和EF4时,希望他们的SELECT语句包含NOLOCK提示的人的"官方Microsoft"响应是什么?
顺便说一下,我发现的绝对最好的信息就在这里,我鼓励每个对这个主题感兴趣的人阅读这个主题.
谢谢.
gbn*_*gbn 30
NOLOCK ="READ UNCOMMITTED"=脏读
我假设MS知道为什么他们选择默认隔离级别为"READ COMMITTED"
NOLOCK,实际上是任何提示,都应该非常明智地使用:默认情况下不是这样.
你的DBA是一个布偶.看到这个(SO):在SQL Sever中的每个SELECT上使用(nolock)会导致什么结果?.如果您碰巧在银行或我可能拥有帐户的任何机构工作,请告诉我,以便我可以关闭它.
Rya*_*nig 11
我是Microsoft的SQL组织中的工具团队的开发人员.我绝对没有授权做任何正式声明,我确信有些人比我更了解这些事情.尽管如此,我将提供一个友好的经验法则,主题是"过早优化是万恶之源":
在你必须这样做之前,不要使用NOLOCK(或任何其他查询提示).如果你有一个具有合适查询计划的select语句,并且当系统上的其他负载很少时它运行正常,但是当其他查询访问同一个表时它会变慢,请尝试添加一些NOLOCK提示.但总是要明白,当你这样做时,你就冒着获得不一致数据的风险.如果您正在编写一些关键任务应用程序,可以进行网上银行业务或控制飞机,这可能是不可接受的.然而,对于许多应用而言,性能加速值得冒险.但是,根据具体情况进行评估.不要只是无处不在地使用它们.
如果您确实选择使用NOLOCK,我使用扩展方法在C#中发布了一个解决方案,以便您可以轻松更改LINQ查询以使用NOLOCK提示.如果您能将其改编为EF4,请发布您的改编.
如果ef4生成所有查询,EF4目前没有内置方法.
有很多方法可以解决这个问题,例如使用存储过程或更加扩展的内联查询模型,但是,至少可以说这很费时间.
我相信(我不会就微软发言)缓存是微软旨在减轻EF4网站服务器负担的预期解决方案.读取未提交(或nolock)内置到框架中会在同时运行2个上下文时为EF4的预期行为创建不可预测的问题.这并不意味着您的情况需要这种并发级别.
这听起来好像你被要求在所有选择上nolock.虽然我同意早先的海报,如果你有任何需要交易的交易,这可能是危险的,我不同意自动使DBA成为一个布偶.你可能只是在运行一个CMS,这对脏读来说非常酷.您可以更改整个数据库的ISOLATION LEVEL,这可以产生相同的效果.
DBA可能已经为仅仅选择的操作推荐了nolock(这很好,特别是如果有一个ORM被误导并做了一些狡猾的数据转储).关于该muppet评论最有趣的事情是Stack Overflow本身以READ UNCOMMITTED模式运行SQL服务器.猜猜你需要在其他地方找到解决问题的答案吗?
与您的DBA讨论在数据库级别设置此功能的可能性,或者如果您只在少数几个地方需要它,请考虑缓存策略.毕竟网络是无状态的,所以除非你直接解决,否则并发往往是一种错觉.
wom*_*omp -1
我知道这不是你问题的答案,但我只是想把它放进去。
在我看来,这是(至少部分)DBA 的工作。可以说应用程序应该以某种方式运行,并且您可以而且当然应该尝试按照他想要的方式对其进行编程。
不过,唯一可以确定的方法是 DBA 与您一起处理应用程序并构建他想要呈现给应用程序的数据库表面。如果他希望将关键表作为 READ UNCOMMITTED 进行查询,那么他应该帮助提供一组具有正确访问权限和隔离级别的存储过程。
依靠应用程序代码来正确构建每个即席查询并不是一种可扩展的方法。
| 归档时间: |
|
| 查看次数: |
10705 次 |
| 最近记录: |