Короткий ответ на ваш вопрос: ДА, может и будет коротким. Если вы хотите заблокировать одновременное выполнение хранимых процедур, запустите транзакцию и обновляйте одни и те же данные при каждом выполнении хранимой процедуры, прежде чем продолжать выполнять какую-либо работу в рамках процедуры.
CREATE PROCEDURE ..
BEGIN TRANSACTION
UPDATE mylock SET ref = ref + 1
...
Это заставит другие параллельные выполнения ждать своей очереди, поскольку они не смогут изменять значение 'ref' до тех пор, пока не завершатся другие транзакции и не будет снята соответствующая блокировка обновления.
Как правило, рекомендуется предположить, что результат любого и всех запросов SELECT устарел до , когда они вообще выполнялись. Использование «тяжелых» уровней изоляции для обхода этой печальной реальности серьезно ограничивает масштабируемость. Гораздо лучше структурировать изменения таким образом, чтобы сделать оптимистичные предположения о состоянии системы, которое вы ожидаете существовать во время обновления, поэтому, если ваше предположение не удастся, вы можете попробовать позже и надеяться на лучший результат. Например:
UPDATE
MyTable
SET
CounterColumn = current
WHERE CounterColumn = current - 1
Используя ваш пример с добавленным предложением WHERE, это обновление не влияет на строки, если предположение о его текущем состоянии не выполняется. Проверьте @@ ROWCOUNT, чтобы проверить количество строк и откат или какое-либо другое действие в зависимости от ситуации, если оно отличается от ожидаемого результата.