- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道快照隔离可以解决这个问题,但我想知道 NOLOCK 在这种特定情况下是否安全,这样我就可以避免开销。
我有一个看起来像这样的表:
drop table Data
create table Data
(
Id BIGINT NOT NULL,
Date BIGINT NOT NULL,
Value BIGINT,
constraint Cx primary key (Date, Id)
)
create nonclustered index Ix on Data (Id, Date)
表格永远不会更新。删除可以发生,但它们永远不应该与 SELECT 竞争,因为它们会影响表的另一端。插入是常规的,页面拆分到 (Id, Date) 索引非常常见。
我在标准 INSERT 和 SELECT 之间遇到了死锁情况,如下所示:
select top 1 Date, Value from Data where Id = @p0 order by Date desc
因为 INSERT 获取了 Cx (Date, Id; Value) 上的锁,然后是 Ix (Id, Date),但是 SELECT 获取了 Ix (Id, Date) 上的锁,然后是 Cx (Date, Id; Value) .这是因为 SELECT 首先在 Ix 上查找,然后加入到 Cx 上的查找。
交换聚簇索引和非聚簇索引会打破这个循环,但这不是一个可接受的解决方案,因为它会引入其他(更复杂的)SELECT 的循环。
如果我在 SELECT 中添加 NOLOCK,在这种情况下它会出错吗?能否返回:
我已经在网上阅读了很多关于此的内容,但我所见过的重复计数过多或计数不足的异常(one、two)涉及扫描。这只涉及寻找。杰夫·阿特伍德 has a post关于使用 NOLOCK 产生了很好的讨论。我对 Rick Townsend 的评论特别感兴趣:
Secondly, if you read dirty data, therisk you run is of reading theentirely wrong row. For example, ifyour select reads an index to findyour row, then the update changes thelocation of the rows (e.g.: due to apage split or an update to theclustered index), when your selectgoes to read the actual data row, it'seither no longer there, or a differentrow altogether!
仅插入而不更新是否可能?如果是这样,那么我想即使我在仅插入表上进行搜索也可能很危险。
更新:
我想弄清楚 how snapshot isolation works .它似乎是基于行的,其中事务读取表(没有共享锁!),找到它们感兴趣的行,然后查看它们是否需要从 tempdb 中的版本存储中获取该行的旧版本。
但在我的例子中,每一行都不会有一个以上的版本,所以版本存储似乎毫无意义。如果发现该行没有共享锁,这与仅使用 NOLOCK 有何不同?
最佳答案
使用 NOLOCK 或 READ UNCOMMITTED 意味着您放弃任何一致性保证。期间。
如果您需要一致性,请不要进行脏读。您的整个解释依赖于未记录的行为,这些行为可能会在未来的版本中发生变化,更糟糕的是,依赖于您希望查询的特定访问计划。查询优化器可以自由选择它认为合适的任何计划,并且您所做的任何假设都可能在生产中被打破。回到原点:如果您没有准备好面对后果,请不要进行脏读。
不确定这是否适用,不清楚您尝试通过查询/表实现的目标,但也许这篇文章可能有所帮助:Using tables as Queues .
已更新
如果 NOLOCK 读取会读取不一致的状态(例如,读取陈旧的非聚集索引键并将其追踪到聚集索引中缺失的行),则快照读取会在版本存储中找到“缺失”的行。对于稳定数据,快照读取与非锁定读取相同。每当数据发生更改(未提交的更新)时,版本存储的魔力就会发挥作用,因为快照读取进入版本存储并找到“旧”值(稳定且一致),而 nolock 读取将在其中失控并追逐指针啦啦乐园。
关于sql-server - 在这种情况下 READ UNCOMMITTED/NOLOCK 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3001531/
我知道 with(nolock) 和 (nolock) 相同或几乎相同。 REF:with(nolock) or (nolock) - Is there a difference? 但是nolock怎
一切都基于这样的假设:with(nolock) 完全适合这种情况。已经有很多问题在争论是否使用 with(nolock)。 我环顾四周,无法找到使用 with(nolock) 之间是否存在实际差异:
我想在 Hive 中执行一个选择查询,但是花了很长时间我决定检查我的表锁定状态。显然该表已被某些正在进行的查询锁定。 我知道在这种情况下,SQL 具有with (nolock),我可以在表上应用它。
我在我的程序中声明了一个表,您可以在下面看到: Declare @resultTable Table ( EmpId int, EmpStatusId int, CreatedDateTi
使用 ActiveRecord 时需要添加“WITH NOLOCK”吗?我知道有一种方法可以做到 nHibernate,但在 ActiveRecord 中无法解决这个问题。 感谢您的帮助。 问候, 最
为了处理 SQL 超时,我尝试使用 SqlAzureExecutionStrategy ( https://msdn.microsoft.com/en-us/data/dn456835.aspx )
为什么向查询添加 nolock 会导致它增加执行时间? UPDATE TargetTable SET col1 = c1.RowCnt, col2 = c2.RowCnt
我正在 C#.Net 中创建一个自我项目,通过使用 3 层应用程序,我不想让我的 sql 语句具有事务性,这些语句用于多个存储过程,我一直在使用 WITH(NOLOCK)方法来查询在事务期间用于插入或
我正在开发一个多线程应用程序 (C#),并且 2 个线程同时使用 NOLOCK 更新表,这是一个问题吗?更具体地说,它们都更新相同的记录。 最佳答案 答案是“视情况而定”。 NOLOCK 允许“脏读”
在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST 。有关 NOLOCK 和 READPAST
我正在处理一个糟糕的 View ,它在内部将许多 许多 表连接在一起,其中一些是同一张表。 我想知道,当一个表被连接到自身时,如果 NOLOCK 提示是在一个连接上而不是另一个连接上,它是如何解释的?
今天我在尝试使用 NOLOCK 访问远程表时遇到了一个问题。 .我收到此错误: Remote table-valued function calls are not allowed. 在谷歌搜索这个问
我知道您通常会在表级别应用WITH (NOLOCK),但假设您希望将 15 个表连接在一起。有没有一种更简单的方法可以将 WITH (NOLOCK) 应用于所有表,而不必在每个表名后面写入它? 最佳答
在一个巨大的数据库上工作,我正在提取大量数据。例如我的查询是 select * from temp 这导致我的应用程序用户出错,然后我意识到我的问题是因为我的查询提取数据花费的时间太长。 然后我用 修
在工作中,用户非常乐意使用 Reporting Services 的报表生成器生成自己的报表。 但是,遗憾的是,它生成的查询效率非常低,而且它们不使用“WITH (NOLOCK)” - 对每个人来说都
使用 SQL Server 数据库开发 Spring-Hibernate 应用程序。我们陷入僵局。事务属性是通过 Spring 配置定义的。该应用程序在应用程序代码中实现了悲观锁定。当用户开始处理客户
有人可以给我一些指导,告诉我什么时候应该使用WITH (NOLOCK)而不是SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 各自的优点/缺点是什么?使
背景:我想运行一个对性能至关重要的查询,并且我不关心脏读。 我的问题是;如果我使用连接,我是否还必须在这些连接上指定 NOLOCK 提示? 例如;是: SELECT * FROM table1 a W
我曾在一个非常大的组织工作,他们必须在大多数查询中使用 NOLOCK - 因为数据通常在白天通过 ETL 过程更新并锁定应用程序 40% 的工作一天当然不是一个选择。 出于习惯,在我的下一个地方,我继
我正在尝试在更新查询中添加 with(NOLOCK): UPDATE pth_patchLookup with(nolock) SET ScanDateTime = Getdate() WHERE R
我是一名优秀的程序员,十分优秀!