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