SQL-запрос с блокировкой таблицы - PullRequest
0 голосов
/ 09 июля 2009

У меня спор с коллегой-разработчиком по команде.

Проблема: SQL-запрос X выполняется в тестовой системе в течение 1 секунды, но в реальной системе в течение неизвестного времени (150 пользователей могут одновременно выполнять запросы). Запрос вызывает блокировки для 8 таблиц, из которых 7 бесполезны. Его идея - поставить WITH (NOLOCK) на 7 столов, чтобы больше не было блокировок.

Мой аргумент:

Мое предложение заключается в том, что при нулевой блокировке существует вероятность того, что пользователь 1 выполнит запрос на выборку, для выполнения которого требуется 10 секунд, поскольку в данный момент производительность сервера низкая, а пользователь 2 изменяет значение в одной из 7 таблиц, например, клиент. Тогда запрос будет полностью неправильным или, возможно, ожидаемый набор данных не может быть заполнен, и он вылетает и выдает ошибку. Так что используйте Rowlock.

Его аргумент:

Нам не нужна блокировка строк, шансы получить такой сценарий слишком малы. Нам не нужно быть идеальным. Делай то, что от тебя требуют, и не думай.

Что я могу сказать, чтобы победить таких людей, которые не рассчитывают на перфекционизм?

Ответы [ 6 ]

4 голосов
/ 09 июля 2009

Я полагаю, исходя из того, что вы сказали, что вы правы в своих рассуждениях.

Если есть ЛЮБАЯ вероятность того, что что-то может пойти не так, независимо от того, насколько мал шанс в операции, которая приводит к потере целостности базы данных, она ДОЛЖНА быть исправлена.

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

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

Если ваш коллега не поддается тому, что вы говорите, И если вы ДЕЙСТВИТЕЛЬНО уверены, что вы правы в своих рассуждениях, тогда я сообщу руководителю вашей группы, почему вы считаете это важным, и покажу ему свое решение. Если он согласен с вашим коллегой, потому что считает, что целостность базы данных не важна, то, возможно, вам стоит взглянуть на работу в другом месте.

Не поймите меня неправильно, я понимаю, что в реальном мире программное обеспечение не может быть «идеальным», иначе оно никогда не будет выпущено. Но что-то столь же фундаментальное, как проверка ввода данных, не должно быть пропущено, и это не сложно сделать. По сути, это то же самое, что сказать: «Хорошо, давайте не будем проверять пользовательский ввод». Это то, что вы узнаете, как это сделать на первом курсе компьютерных наук!

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

1 голос
/ 10 июля 2009

Подсказки по блокировке в SQL Server 2000 (SS2k) были полезны, потому что SS2k был жадным по отношению к блокировке операторов UPDATE и по умолчанию использовал TABLELOCK и сужал его по мере продвижения. Если бы вы знали шаблон вашего оператора UPDATE, вы могли бы использовать подсказки блокировки для повышения производительности, и SS2k увеличил бы блокировку при необходимости.

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

Я считаю, что эскалация блокировки была переработана в SQL Server 2005, и подсказки блокировки больше не соблюдаются.

0 голосов
/ 09 июля 2009

"Делай что хочешь от тебя и не делай думаю. "

Помните, что вы всегда являетесь человеком, ответственным за ваш собственный код, если что-то идет не так, вы не можете сказать: «Он сказал мне, что делать это, бла-бла-бла» ...

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

0 голосов
/ 09 июля 2009

Исходя из моего опыта, Закон Мерфи верен: Если что-то может пойти не так, это будет .

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

0 голосов
/ 09 июля 2009

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

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

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

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

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

0 голосов
/ 09 июля 2009

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

Это делает SQL Server намного более эффективным, чем Oracle, и устраняет проблемы, вызванные блокировкой писателей читателями. Пожалуйста, ознакомьтесь с недостатками, прежде чем принять решение использовать его.

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