Одновременные проблемы в SQL Server - PullRequest
0 голосов
/ 25 сентября 2018

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

Спасибо.

1 Ответ

0 голосов
/ 25 сентября 2018

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

Первая идея кода / архитектуры, которая приходит на ум, - это реструктурировать эту таблицу.Я предполагаю, что у вас большие объемы обновлений, иначе вы не столкнетесь с этими нарушениями.Вы можете просто использовать блок try / catch и повторить попытку блока catch при нарушении PK.Неуклюжий, но может просто сделать трюк.

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

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

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

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