I'm in the business of making website and applications that are not mission critical -> eg. banking software, space flight, intensive care monitoring application, etc. You get the idea.

那么,有了这么多的免责声明,在某些Sql语句中使用NOLOCK提示是否不好?几年前,一位Sql管理员同事建议,如果我对"脏读"感到满意,我应该使用NOLOCK,因为每次读取都不会锁定表/行/任何内容,这将使我的系统性能提高一点.

我还被告知,如果我遇到死锁,这是一个很好的解决方案.所以,我开始遵循这个 idea 好几年了,直到一位Sql专家帮我编写一些随机代码,并注意到我的Sql代码中所有的NOLOCK.我被礼貌地责骂了一顿,他试图向我解释(为什么这不是一件好事),我有点迷路了.我觉得他的解释的实质是"这是一个解决更严重问题的创可贴解决方案."尤其是当你遇到死锁时.因此,请解决问题的根源".

我最近在谷歌上搜索了一下,发现了this post个.

那么,一些sql db大师的老师能启发我吗?

推荐答案

在NOLOCK提示下,SELECT语句的事务隔离级别为READ UNCOMMITTED.这意味着查询可能会看到脏的和不一致的数据.

一般来说,这不是一个好主意.即使这种脏读行为适用于基于web的关键任务应用程序,NOLOCK扫描也可能会导致601错误,这将由于缺少锁定保护而导致数据移动而终止查询.

我建议阅读When Snapshot Isolation Helps and When It Hurts——MSDN建议在大多数情况下使用读提交快照而不是快照.

Sql相关问答推荐

表名数组

SQL JOIN of 2 Table with 2 sum

Postgres JSONB对象筛选

SQL使最终结果显示两个表后的所有数据(匹配和不匹配)?

更新PostgreSQL 15中的JSON值

对非RUST源代码字符串使用`stringify!`,例如SQL查询

更新其组的日期字段值小于最大日期减go 天数的记录

NULL-生成的列中连接的字符串的输入

数组列的postgres更新查询

如何在多列上编写具有不同条件的查询?

如何使子查询在UPDATE语句期间获得最新更新

将具有嵌套 XML 的列转换为 SQL 中的表格格式?

在presto sql中解析带有区域的时间格式

如何在 case 语句中使用聚合?

try 将多行折叠为单个结果

在多个表上递归查找

As400 (IBM i) SQL 表 QSYS2.SYSTABLES 上的元数据

如何从 2 个 SQLite 表构建嵌套对象?

如何在 PL/SQL 中区分返回的 XML 值?

如何计算每行出现的次数并显示在另一个表中?