WAITFOR для проблемы параллелизма в SQL - PullRequest
1 голос
/ 10 февраля 2012

У нас есть сложная хранимая процедура, которая сначала выполняет INSERTS, а затем выполняет UPDATES в определенной строке.В идеале после выполнения этого запроса, если пользователь 2 нажимает на тот же SP, и вместо ОБНОВЛЕНИЯ должны произойти некоторые ВЫБОРЫ.В случае, если более одного запроса поступает одновременно с выполнением первой операции, мы естественным образом получаем взаимоблокировки с этим ОБНОВЛЕНИЕМ.

Мы думаем о реализации WAITFOR таким образом, чтобы SP сначала установил флаг в глобальной временной таблицеперед запуском и, если приходит второй запрос, он ждет некоторое время, чтобы повторить попытку, так что через 10 секунд он может повторить попытку, и, если он увидит, что обновление выполнено, он может полностью перейти к логике SELECT.Таким образом, мы чувствуем, что ни один пользователь не получит взаимоблокировку, после того, как, скажем, через 5-10 секунд будут получены окончательные результаты.

Является ли использование WAITFOR таким же хорошим или проблема архитектуры БД для возможной проблемы в будущем?

1 Ответ

0 голосов
/ 10 февраля 2012

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

Внедрение спин-блокировки в процесс SQL - это то, что обычно не работает.

Я писал о некоторых шаблонах, которые вы можете использовать некоторое время назад: http://samsaffron.com/archive/2008/08/27/Deadlocked+

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