锁定SQL表格/行,并使用NOLOCK/READPAST。

25 浏览
0 Comments

锁定SQL表格/行,并使用NOLOCK/READPAST。

我是一个使用高度更新的Microsoft SQL Server数据库的最终用户,其中包含数十个表,每个表中有数亿行数据。银行数据库是我工作的一个很好的例子,不同的是在我的数据库中,UPDATE语句很少使用,而INSERT语句经常使用(一旦一行数据进入表中,很少会更改)。

我个人不使用任何UPDATE/INSERT语句,只使用SELECT语句(带有复杂的WHERE/JOIN/CROSS/GROUP子句)。

我有一些关于锁定和使用NOLOCK/READPAST的问题。

1. 我如何知道我正在使用的查询是锁定一行还是整个表?

例如,我注意到这个查询没有锁定其他用户向表中插入新数据:

SELECT *
FROM Table

而这个查询锁定了:

SELECT COUNT(Date)
FROM Table

当然,这只是例子,不是我实际使用的完整查询。

正如我所提到的,行很少更改,所以锁定一行不会让我担心,但锁定整个表是非常令人担忧的。

2. 我想了解在我的查询中使用NOLOCK/READPAST的风险(以消除我对锁定表的担忧)。

我搜索了很多,但找不到一个完整的答案。

我不在乎使用NOLOCK/READPAST可能会获取过去的数据(这些数据很少更改)或可能会错过一些新添加的数据。

我在几个地方读到过使用NOLOCK可能会导致重复数据/损坏的数据,这对我来说是个问题。

3. READPAST和NOLOCK之间到底有什么区别?就上述问题而言,哪个更“安全”?

谢谢。

0
0 Comments

在SQL中,锁定表或行以及使用NOLOCK/READPAST的问题的出现原因是为了防止在读取数据时数据发生变化。这不仅适用于更新的记录,还适用于插入的记录。NOLOCK/READPAST是解决这个问题的方法之一,但是它们应该尽量避免使用,除非在极少数情况下,否则最好优化查询以提高性能并减少记录被锁定的数量和时间。NOLOCK不会锁定读取的记录,这意味着在读取过程中记录可能会发生变化,而READPAST则会跳过被锁定的行。在使用NOLOCK时存在数据损坏的风险,而使用READPAST时可能会错过一些新添加的行。因此,更好的解决方法是学习优化查询以减少需要锁定的记录数量,并改善性能,使锁定存在的时间尽量减少。

0