Что такое & ldquo; с (nolock) & rdquo; в SQL Server?

function number_format(string,decimals=2,decimal=',',thousands='.',pre='R$ ',pos=' Reais'){
  var numbers = string.toString().match(/\d+/g).join([]);
  numbers = numbers.padStart(decimals+1, "0");
  var splitNumbers = numbers.split("").reverse();
  var mask = '';
  splitNumbers.forEach(function(d,i){
    if (i == decimals) { mask = decimal + mask; }
    if (i>(decimals+1) && ((i-2)%(decimals+1))==0) { mask = thousands + mask; }
    mask = d + mask;
  });
  return pre + mask + pos;
}
var element = document.getElementById("format");
var money= number_format("10987654321",2,',','.');
element.innerHTML = money;
#format{
display:inline-block;
padding:10px;
border:1px solid #ddd;
background:#f5f5f5;
}
<div id='format'>Test 123456789</div>

566
задан TylerH 14 March 2018 в 04:52
поделиться

13 ответов

С (NOLOCK) эквивалент использования ЧТЕНИЯ, НЕЗАФИКСИРОВАННОГО как уровень изоляции транзакции. Так, Вы стоите риск чтения незафиксированной строки, которая впоследствии откатывается, т.е. данные, которые никогда не превращали его в базу данных. Так, в то время как это может предотвратить чтения, заводимые в тупик другими операциями, это идет с риском. В банковском приложении с высокими скоростями обработки транзакций это, вероятно, не собирается быть правильным решением любой проблемы, которую Вы пытаетесь решить с ним, по моему скромному мнению.

436
ответ дан 22 November 2019 в 22:09
поделиться

Я использую с (nolock) подсказку особенно в базах данных SQLServer 2000 с высоким действием. Я не уверен, что это необходимо в SQL Server 2005 как бы то ни было. Я недавно добавил, что подсказка в SQL Server 2000 по требованию DBA клиента, потому что он замечал много блокировок записи SPID.

Все, что я могу сказать, - то, что использование подсказки НЕ причинило нам боль и, кажется, заставило проблему блокировки решить себя. DBA в том конкретном клиенте в основном настоял, чтобы мы использовали подсказку.

Между прочим, базы данных, с которыми я имею дело, являются бэкендами к предприятию медицинские системы требований, таким образом, мы говорим приблизительно миллионы записей и 20 + таблицы во многих соединениях. Я обычно добавляю С (nolock) подсказку для каждой таблицы в соединении (если это не полученная таблица, в этом случае Вы не можете использовать ту конкретную подсказку),

6
ответ дан 22 November 2019 в 22:09
поделиться

Используйте nolock, когда Вы будете хорошо с "грязными" данными. Что означает, что nolock может также считать данные, которые находятся в процессе того, чтобы быть измененным и/или незафиксированных данных.

Это обычно - не хорошая идея использовать его в высокой среде транзакции, и именно поэтому это не опция по умолчанию на запросе.

6
ответ дан 22 November 2019 в 22:09
поделиться

Я раньше получал "следующий пакет" для вещей сделать. Это не имеет значения в этом случае, какой точный объект, и у меня есть много пользователей, выполняющих этот тот же запрос.

7
ответ дан 22 November 2019 в 22:09
поделиться

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

Для финансовой документации (и почти все другие записи в большинстве приложений) nolock нанес бы ущерб, поскольку Вы могли потенциально считать данные назад из записи, которая писалась в, и не получают корректные данные.

8
ответ дан 22 November 2019 в 22:09
поделиться

Простой ответ - каждый раз, когда Ваш SQL не изменяет данные, и у Вас есть запрос, который мог бы вмешаться в другое действие (через блокировку).

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

Особенно полезно, если у Вас есть отчеты типа OLAP, Вы работаете против базы данных OLTP.

Первый вопрос спросить, тем не менее, "почему я волнуюсь об этом?" ln, мой опыт, уклоняясь от поведения при блокировании по умолчанию часто происходит, когда кто-то находится в "попытке что-либо", режим и это является одним случаем, где неожиданные последствия не маловероятны. Слишком часто это - случай преждевременной оптимизации и может слишком легко быть оставлено встроенным в приложение "на всякий случай". Важно понять, почему Вы делаете его, какую проблему это решает, и есть ли у Вас на самом деле проблема.

14
ответ дан 22 November 2019 в 22:09
поделиться

Другой случай, где это обычно хорошо, находится в базе данных создания отчетов, где данные, возможно, уже в возрасте, и записей просто не происходит. В этом случае, тем не менее, опция должна быть установлена в базе данных или уровне таблицы администратором путем изменения уровня изоляции по умолчанию.

В общем случае: можно использовать его, когда Вы очень уверены, что это должно хорошо считать старые данные. Важная вещь помнить состоит в том что его очень легкое для понимания этого превратно. Например, даже если это хорошо в то время, когда Вы пишете запрос, действительно ли Вы уверены, что что-то не изменится в базе данных в будущем для создания этих обновлений более важными?

Я буду также 2-й понятие, что это - вероятно, не хорошая идея в банковском приложении. Или приложение инвентаризации. Или где угодно Вы думаете о транзакциях.

17
ответ дан 22 November 2019 в 22:09
поделиться

Можно использовать его, когда Вы только считываете данные, и Вы действительно не заботитесь о том, могли ли Вы возвращать данные, которые еще не фиксируются.

Это может быть быстрее на операции чтения, но я не могу действительно сказать сколько.

В целом я рекомендую против использования его - чтение незафиксированных данных может немного сбивать с толку в лучшем случае

20
ответ дан 22 November 2019 в 22:09
поделиться

NOLOCK эквивалентно READ UNCOMMITTED, однако Microsoft заявляет, что Вы не должны использовать ее для UPDATE или DELETE операторы:

Для ОБНОВЛЕНИЯ или Операторов удаления: Эта функция будет удалена в будущей версии Microsoft SQL Server. Избегайте использования этой функции в работе новой разработки и запланируйте изменить приложения, которые в настоящее время используют эту функцию.

http://msdn.microsoft.com/en-us/library/ms187373.aspx

Эта статья относится к SQL Server 2005, таким образом, поддержка NOLOCK существует, если Вы используете ту версию. Для соответствования требованиям завтрашнего дня, Вы кодируете (предположение, что Вы решили использовать грязные чтения), Вы могли использовать это в своих хранимых процедурах:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

23
ответ дан 22 November 2019 в 22:09
поделиться

Примером учебника для законного использования подсказки nolock является выборка отчета против высокой базы данных OLTP обновления.

Взять актуальный пример. Если бы крупный американский банк главной улицы хотел выполнить почасовый отчет, ища первые знаки городского уровня, выполненного на берегу, то запрос nolock мог отсканировать таблицы транзакций, суммировав денежные вклады и снятие наличных на город. Для такого отчета крошечный процент ошибки, вызванной откатываемыми транзакциями обновления, не уменьшил бы значение отчета.

52
ответ дан 22 November 2019 в 22:09
поделиться

Вопрос - то, что хуже:

  • мертвая блокировка, или
  • неправильное значение?

Для финансовых баз данных мертвые блокировки намного хуже, чем неправильные значения. Я знаю наизусть, который звучит, но выслушайте меня. Традиционный пример транзакций DB - Вы, обновляют две строки, вычитающие от одной и добавляющие к другому. Это неправильно.

В финансовой базе данных Вы используете деловые сделки. Это означает добавлять одну строку к каждой учетной записи. Это имеет наибольшее значение, что эти завершенные транзакции и строки успешно записаны.

Получение остатка на счете временно неправильно не является грандиозным предприятием, для именно это конец дневного согласования. И превышение ограничений из учетной записи, намного более вероятно, произойдет, потому что два банкомата используются сразу, чем из-за незафиксированного чтения от базы данных.

Тем не менее 2005 SQL Server исправил большинство ошибок, которые сделали NOLOCK необходимо. Таким образом, если Вы не используете SQL Server 2000 или ранее, Вам не должен быть нужен он.

Дальнейшее чтение
Управление версиями уровня строки

162
ответ дан 22 November 2019 в 22:09
поделиться

Не уверен, почему вы не заключаете финансовые транзакции в транзакции базы данных (например, когда вы переводите средства с одной учетной записи на другую - вы не фиксируете одну сторону транзакции за раз - вот почему существуют явные транзакции) . Даже если ваш код безрассуден для бизнес-транзакций, как это звучит, все транзакционные базы данных могут выполнять неявные откаты в случае ошибок или сбоя. Я думаю, что это обсуждение вышло вам надуманным.

Если у вас возникли проблемы с блокировкой, внедрите управление версиями и очистите свой код.

Отсутствие блокировки не только возвращает неправильные значения, но и возвращает фантомные записи и дубликаты.

Распространенное заблуждение, что это всегда заставляет запросы выполняться быстрее. Если для таблицы нет блокировок записи, это не имеет никакого значения. Если в таблице есть блокировки, это может ускорить запрос, но есть причина, по которой блокировки были изначально изобретены.

Честно говоря, вот два особых сценария, в которых подсказка nolock может предоставить полезность

1) База данных sql-сервера до 2005 года, которая должна выполнять длинный запрос к действующей базе данных OLTP, это может быть единственным способом

2) Плохо написанное приложение, которое блокирует записи и возвращает управление пользовательскому интерфейсу, а считыватели блокируются на неопределенный срок. Nolock может быть здесь полезен, если приложение не может быть исправлено (стороннее и т. Д.), А база данных либо до 2005 года, либо невозможно включить управление версиями.

30
ответ дан 22 November 2019 в 22:09
поделиться

Мои 2 цента - имеет смысл использовать WITH (NOLOCK), когда вам нужно генерировать отчеты. В этот момент данные не сильно изменятся, и вы не захотите блокировать эти записи.

9
ответ дан 22 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: