Sivachandran R Ответов: 2

Sql server и web API "превышен период ожидания запроса блокировки" для хранимой процедуры


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

Что я уже пробовал:

я использую набор "LOCK_TIMEOUT 15000" в процедуре.

MadMyche

Действительно трудно помочь вам исправить код, который мы не видим; по крайней мере, без обзора индексов таблиц и оптимизации процедур, как мы должны получить ответ?

Sivachandran R

Фактически синхронизация данных с мобильного на sql и sql на мобильный через веб-api . Формат таблицы имеет кластеризованный и некластеризованный индекс. Одновременно несколько устройств отправляют и получают огромное количество данных с sql server. Процедура имеет обычную вставку и обновление в таблицы. Я отправлю sp, когда доберусь до своего рабочего места. Спасибо за ваш ответ

2 Ответов

Рейтинг:
15

Gerry Schmitz

Загрузите транзакции с каждого устройства в виде пакета в плоский файл; затем запустите процессор для каждого пакета вместо "принудительной подачи".


Sivachandran R

Спасибо за ваш ответ. Не могли бы вы дать мне более подробную информацию о “batch as flat file”,так как я очень новичок в разработке приложений для android-устройств, даже если есть какая-то статья.

Gerry Schmitz

Сколько устройств? Создайте несколько серверов и синхронизируйте их для 25-центового решения.

Sivachandran R

Около 10 устройств каждое устройство публикует около 2500 записей в одну таблицу одновременно. Все данные в объекте Json публикуются через web api.so что может быть лучшим вариантом для ответа 2.

Рейтинг:
12

Vivek_Dutta

Насколько я понимаю эту проблему - предполагая, что хранимый proc выполняет много бизнес-логики, вы можете сделать;
1) сбросьте данные от каждого пользователя в таблицу БД (не файлы - очень трудно управлять). Используйте службу Windows или запланированную задачу для чтения данных из этой таблицы и выполнения процедуры storeprocedure.
2) сбросьте данные от каждого пользователя в таблицу БД (не файлы - очень трудно управлять). Используйте задание SQL для чтения данных из этой таблицы и выполнения процедуры storeprocedure.
3) Сделайте свой вызов API однопоточным, чтобы он выполнял любой последующий вызов ожидания с использованием объектных блокировок. Для этого требуется много управляемого кода, основанного на том, сколько пользователей публикуют данные. Если сохраненный proc делает прямую вставку, это хороший вариант.


Gerry Schmitz

"Транзакции" поступают в виде "плоских записей".

Каковы бы ни были ваши чувства по поводу "плоских файлов", загрузка начинается с файла "сообщения" (XML; JSON; BINARY), который является плоским. Сервер обновляет базу данных плоскими записями с устройства. Независимо от того, помещаются ли плоские записи в файл БД, это промежуточный шаг между плоскими и БД.

Вы понимаете, что он говорит: "сервер баз данных-это горлышко бутылки"? Существуют "файловые" (upload) серверы (т. е. FTP) и серверы баз данных; и есть разница.

Vivek_Dutta

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