2017-09-01 39 views
0

我想从审计表中读取数据,其中数据只读且未由应用程序修改。应用程序仅将数据插入表中,但不更新现有记录。在无法修改的数据上选择无锁提示的查询

select * from mytable with(nolock) where id in (1,2,3,4,5) 

我知道“无锁”意味着获得未提交的数据,但我提供这将提交一个ID(1,2,3,4,5)。那么,这种方法的任何担忧或副作用是不是?

回答

0

NOLOCK确实意味着您将读取'脏'数据,因此您可以读回未提交的值,然后可以将其回滚,这意味着您获取的数据不准确。所以,只要你很高兴你正在读脏数据,你就没事。

与传递给查询的ID不太相关,如果它们不在那里,它就不会返回一行。如果你的查询中选择了*,比如说一列是'name',ID 1的'name'是'Test',我打开一个事务,将它更新为'LIVE',然后运行以上。你会看到ID为'LIVE'的'名字',然后我将它回滚,所以在数据中它实际上是'测试',这意味着你的阅读不准确。

如果您没有指定'NOLOCK',您的选择会在返回任何数据之前一直等到我的事务完成之后,它将是已提交到数据库的数据,而不是数据在当时的状态读。

+2

NOLOCK还可能导致数据被跳过或重复,例如在分配顺序扫描期间发生页面拆分。 –

+0

@ Leonidas199x - mytable不会被应用程序更新。 – DeepInJava

+0

@DeepInJava是完全静态的数据,是任何人或任何人更新它? – Leonidas199x