Я пытаюсь написать код базы данных, чтобы убедиться, что он не зависит от условий гонки, чтобы убедиться, что я заблокировал правильные строки или таблицы. Но я часто задаюсь вопросом: правильный ли мой код? Можно ли заставить какие-либо существующие расы проявить себя? Я хочу быть уверен, что если они произойдут в производственной среде, мое приложение будет работать правильно.
Я обычно точно знаю, какой параллельный запрос может вызвать проблему, но я не знаю, как заставить их запускаться одновременно, чтобы увидеть, происходит ли правильное поведение (например, я использовал правильный тип блокировки), что правильные ошибки брошенный и т. д.
Примечание: я использую PostgreSQL и Perl, поэтому, если на этот вопрос нельзя дать общий ответ, его, вероятно, следует пометить заново.
Обновление: я бы предпочел, чтобы решение было программным. Таким образом, я могу написать автоматизированные тесты, чтобы убедиться, что нет регрессий.
источник
Ответы:
Я делаю это все время с моими модулями T-SQL.
По сути, все, что вам нужно сделать, это запустить ваши модули из двух или более соединений в цикле в течение пары минут . Как правило, все потенциальные проблемы обнаруживаются в течение нескольких минут, при условии, что у вас есть блок SQL Server с достойными процессорами.
Я написал несколько примеров здесь и здесь .
источник
Я обычно работаю с инструментом командной строки СУБД, просто запустив 2 (или более) экземпляра CLI. Затем вы можете воспроизвести один за другим и в виде гонки (которая будет выглядеть как action-RPG) SQL-операторов, отправляемых вашим прикладным уровнем. Вы должны поэкспериментировать / почувствовать работу систем блокировки в действии, так как ваш CLI немного «зависнет», ожидая снятия блокировок с других CLI.
Если это звучит как грязь, не стесняйтесь говорить об этом ;-)
источник
Условия гонки требуют многократного выполнения потока, поэтому для модульного тестирования вам понадобится запустить один или несколько потоков. В Oracle я бы использовал DBMS_Scheduler для запуска процесса для симуляции второго пользователя. Если в PostgreSQL / Perl есть способ инициировать второй процесс программно, то вы должны сделать что-то вроде этого:
Процесс 1 Процесс 2
Хорошо видеть размышления о том, как справляться с условиями гонки и, что более важно, как их тестировать.
источник
Пока вы блокируете ряды, вы не должны попадать в состояние гонки, поскольку это обычно происходит, когда нет блокировки.
Но вы можете зайти в тупик, если один вопрос заблокирует ваш вопрос слишком долго.
Это трудно проверить, так как время для запросов может измениться при увеличении базы данных.
Запросы, которые хорошо работают с 100 000 строк тестовых данных, уходят с графика с 10 000 000 строк.
Этот тип проблемы может быть очень трудно найти заранее, но у многих БД есть какой-то метод выявления медленных запросов.
Используя это правило, вы сможете перехватывать любые запросы, которые могут вызвать проблемы, с достаточным предупреждением.
Если вы делаете блокировку самостоятельно, это другая история, но там я не могу помочь.
источник
select for update
если бы они не существовали ...