2009-10-02 1 views
3

Прежде всего, я не спрашиваю, использовать или не использовать NOLOCK. Давайте пройдем мимо этого.Будет ли подсказка SQL Server NOLOCK возвращать частично написанные строки?

Я думаю, вопрос сводится к тому, как sql-сервер записывает данные? Является ли вся строка написанной сразу или она записывает столбцы за раз?

Я прошу, потому что намек NOLOCK рассматривается. Грязное чтение в порядке, пока вся строка возвращается (или не возвращается). Частично написанные строки неприемлемы.

+0

[Для данных строки LOB/Off это может быть возможно] (http://stackoverflow.com/q/5289683/73226) –

ответ

6

Нет. Операции по модификации данных, такие как вставки, обновления и удаления, защищены физическим уровнем низкого уровня Latches. Все операции доступа к данным, включая блокировку SELECT, должны соответствовать протоколу фиксации. В результате частичная запись никогда не увидит ни один читатель.

3

Нет, он не вернет частично написанные строки. NOLOCK означает, что этот запрос не будет создавать новые блокировки. Это не означает, что он не будет соблюдать существующие блокировки, и сервер sql не будет делать ничего, что записывает данные, не получив сначала блокировку.

То, что он может сделать, это вернуть строки, устаревшие или более не соответствующие, поскольку что-то еще написано в строке, которая обычно была заблокирована этим запросом.

+0

Он игнорирует блокирующие блокировки «Нет общедоступных шлюзов, чтобы предотвратить другие транзакции от изменения данных, прочитанных текущая транзакция и эксклюзивные блокировки, установленные другими транзакциями, не блокируют текущую транзакцию от чтения заблокированных данных ». от http://technet.microsoft.com/en-us/library/ms187373.aspx – gbn

+0

Таким образом, он не вызывает проблем и не отменяет блокировки ... – gbn

+0

Он не выпускает блокировки, но обновление может изменять строку, в то время как выбор с nolock читает его, поэтому, если это так, я думаю, вы можете получить частично написанные строки. – Jeremy