NOLOCK с многопоточностью - PullRequest
       3

NOLOCK с многопоточностью

5 голосов
/ 09 января 2012

Я работаю над многопоточным приложением (C #), и 2 потока одновременно обновляют таблицу, используя NOLOCK, это проблема?Точнее, они оба обновляют одни и те же записи.

Ответы [ 4 ]

4 голосов
/ 09 января 2012

Ответ - «это зависит».

NOLOCK разрешает «грязное чтение».Это означает, что в транзакции , вы можете увидеть незафиксированные данные из другой транзакции.Если у вас есть несколько потоков, обновляющих одну и ту же строку в одной и той же таблице, вы можете увидеть измененное значение данных, которых затронул другой поток, до того, как этот поток завершит свою транзакцию.

Например, возьмите таблицу account_balances, определенную как (account_num int, баланс десятичное (12,2)).Предположим, что происходит следующее:

// предварительное условие, баланс счета № 1 равен 10,00

  1. Поток № 1 начинает транзакцию, уменьшает счет № 1 на 10
  2. Поток № 2 запускает транзакцию, пытается прочитать остаток на счете № 1.Он читает баланс 0. 0. 1014 *
  3. Поток № 2 уменьшает счет на 5 долларов и выдает овердрафт клиенту (их баланс -5)
  4. Поток # 1 откатывает свою транзакцию
  5. Поток # 2 фиксирует свою транзакцию

// Баланс счета теперь -5, хотя он должен быть 5.

То, что вы выиграли 't see - это некоторая форма противоречивых данных в поле - подсказка nolock не похожа на выполнение многопоточного кода без блокировки - отдельные записи по-прежнему атомарны.

2 голосов
/ 09 января 2012

Это означает, что вы можете получить записи, которые находятся в «ошибочном» состоянии.

Например ...

  • Process1 удаляет блок данных
  • Process2 читает перекрывающийся блок данных, WITH NOLOCK

В идеальной ситуации либо все записи, удаляемые Process1, либо присутствуют, либо удаляются. Поскольку Process2 использует NOLOCK, он может прочитать некоторые записей, которые Process1 удаляет, но не другие, поскольку они уже удалены.

То же самое относится к ВСТАВКАМ и ОБНОВЛЕНИЯМ. Вы можете просто читать записи, которые являются лишь частью пути изменения каким-либо образом.


Является ли это проблемой, зависит от ваших данных, вашего дизайна и т. Д.

Поисковой системе все равно, произойдет ли это. Банк, занимающийся финансовыми операциями, будет.

0 голосов
/ 10 января 2012

Будьте осторожны, как вы используете это.Потенциальные несоответствия данных.

Если для одного запроса установлен colA = "newColANewvalue" из таблицы A с помощью (nolock), где colA = "colAOldvalue"

И для другого запроса установлен colC = "colCnewValue" из таблицы A с помощью (nolock)где colA = "colAOldvalue"

В конечном итоге вы можете использовать colC = "colCnewValue" и colA = "newColANewvalue" в той же записи.Если это не проблема, тогда ОК.

Что движет этим?У вас проблемы с производительностью при блокировке строк или при блокировке страниц?

0 голосов
/ 09 января 2012

Невозможно изменить одну и ту же запись одновременно, даже если использовать подсказку NOLOCK.

НО

Вы можете перевести данные в несогласованное состояние.

AFAIK - невозможно применить эту подсказку к целевой таблице обновления.

И - эта подсказка позволяет читать незафиксированные данные, не перезаписывать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...