Блокировка таблицы SQL Server в процедуре хранения без использования транзакции - PullRequest
0 голосов
/ 24 февраля 2011

Мне нужно выполнить процедуру сохранения, которая включает в себя 3 запроса, ссылающихся на одну и ту же таблицу:

MERGE…

ВЫБРАТЬ X ИЗ ТАБЛИЦЫ ГДЕ {BLA BLA}

ОБНОВЛЕНИЕY FROM TABLE WHERE {BLA BLA}

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

В настоящее время я использую транзакцию с сериализуемым уровнем изоляции и WITH (XLOCK)., TABLOCK) подсказка на каждый запрос.

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

Cheers, Doron

Ответы [ 2 ]

3 голосов
/ 24 февраля 2011

Всякий раз, когда разработчик выбирает TABLOCKX или (XLOCK, TABLOCK), он мгновенно теряет право задавать вопросы о производительности.

Не та транзакция, которая вызывает снижение производительности.Держит замки.Таким образом, ваш вопрос на самом деле таков:

Есть ли способ получения штрафов за производительность без влияния штрафов за производительность?

Ответ - нет, такого способа нет.

0 голосов
/ 24 февраля 2011

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

Теперь я регулярно работаю и проектирую базы данных, которые должны выдерживать около 80 000 транзакций в секунду, и благодаря этому вы изучите несколько приемов. Я бы посоветовал вам сделать шаг назад и переоценить архитектуру запросов и таблиц, и если это база данных с высокой степенью транзакций, первое, что я предлагаю, - это избавиться от любых ограничений внешнего ключа, то есть производительности. удар по любой транзакционной БД.

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

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

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

Но пока скажи мне, что ты можешь и не можешь сделать. Надеюсь, это поможет!

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