我知道,光辉的孤立会解决这个问题,但我很想知道,在这种具体情况下,诺琴科是否安全,以便我能够避免间接费用。
我有一个这样的表格:
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)
表格没有任何更新。 删除可能发生,但永远不应与选任考试委员会竞争,因为选举会影响到另一个较老的阶段。 插入是固定的,页数与(Id, 日期)指数相距甚远。
我在标准INSERT与专业考试委员会之间陷入僵局。
select top 1 Date, Value from Data where Id = @p0 order by Date desc
由于INSERT在Cx(Date, Id; Value)和随后的Ix(Id, 日期)上获得一个锁,但SélectT在Ix(Id, 日期)和随后Cx(Date, Id; Value)上获得一个锁。 这是因为选任考试委员会首先在Ix上进行,然后加入到Cx上。
取消分组和非分组指数将打破这一循环,但这不是一种可以接受的解决办法,因为它将与其他(更复杂的)选举制度一起实行周期。
如果我向选任考试委员会增加NLOCK,那么这个案件是否是错误的? 能够返回:
- More than one row, even though I asked for TOP 1?
- No rows, even though one exists and has been committed?
- Worst of all, a row that doesn t satisfy the WHERE clause?
I ve在网上做了许多读物,但只复制了超量或低度异常情况一,见,has a post about using NOLOCK that produced a good discussion. 我对Rick Townsend的评论特别感兴趣:
Secondly, if you read dirty data, the risk you run is of reading the entirely wrong row. For example, if your select reads an index to find your row, then the update changes the location of the rows (e.g.: due to a page split or an update to the clustered index), when your select goes to read the actual data row, it s either no longer there, or a different row altogether!
是否只有插入,而且没有更新? 如果是的话,那么我甚至想在一张只插入的桌子上就可能会有危险。
最新情况:
Im试图标出how snapshot separateworking。 似乎以增长为基础,交易读了表格(没有共同点!),发现它们感兴趣的是行文,然后看它们是否需要从温德布的版本库获得旧的行文。
但就我的情况而言,一行不会超过一个版本,因此该版本的储存似乎毫无意义。 如果发现该行没有共用锁,那么它如何不同于仅仅使用NOLOCK?