Tento escrever o código do banco de dados para garantir que não esteja sujeito às condições de corrida, para garantir que bloqueie as linhas ou tabelas corretas. Mas sempre me pergunto: meu código está correto? É possível forçar a manifestação de qualquer condição de corrida existente? Quero ter certeza de que, se eles acontecerem em um ambiente de produção, meu aplicativo fará a coisa certa.
Eu geralmente sei exatamente qual consulta simultânea provavelmente causará um problema, mas não tenho idéia de como forçá-las a executar simultaneamente para ver se o comportamento correto acontece (por exemplo, usei o tipo correto de bloqueio), que os erros corretos são jogado, etc.
Nota: Eu uso o PostgreSQL e o Perl, portanto, se isso não puder ser respondido genericamente, provavelmente deve ser repetido.
Atualização: eu preferiria se a solução fosse programática. Dessa forma, eu posso escrever testes automatizados para garantir que não haja regressões.
fonte
Respostas:
Eu faço isso o tempo todo com meus módulos T-SQL.
Basicamente, tudo o que você precisa fazer é executar seus módulos a partir de duas ou mais conexões em loop por alguns minutos . Normalmente, todos os problemas em potencial são expostos em alguns minutos, supondo que você tenha uma caixa do SQL Server com CPUs decentes.
Eu escrevi alguns exemplos aqui e aqui .
fonte
Normalmente, eu trabalho com a ferramenta de linha de comando do RDBMS, apenas com 2 (ou mais) instâncias da CLI iniciadas. Você pode reproduzir um por um e, como uma corrida (que pareceria um RPG de ação), as instruções SQL que sua camada de aplicativo está enviando. Você deve experimentar / sentir os sistemas de bloqueio em ação, pois sua CLI "travará" um pouco, aguardando a liberação dos bloqueios da outra CLI.
Se isso parecer claro como lama, não hesite em dizer isso ;-)
fonte
As condições de corrida exigem vários encadeamentos de execução; portanto, para testar a unidade, você precisará iniciar um ou mais encadeamentos. No Oracle, eu usaria o DBMS_Scheduler para executar um processo para simular um segundo usuário. Se o PostgreSQL / Perl tiver uma maneira de iniciar um segundo processo programaticamente, você poderá fazer algo assim:
Processo 1 Processo 2
É bom ver pensando em como lidar com as condições da corrida e, mais importante, como testá-las por unidade.
fonte
Contanto que você bloqueie linhas, não deve entrar em condições de corrida, pois isso geralmente é causado quando não há bloqueio.
Mas você pode ficar em um impasse se uma pergunta a bloquear por muito tempo.
É difícil testar, pois o tempo para consultas pode mudar quando o banco de dados cresce.
As consultas que funcionam bem com 100.000 linhas de dados de teste ficam fora do gráfico com 10.000.000 linhas.
Esse tipo de problema pode ser muito difícil de encontrar com antecedência, mas muitos bancos de dados têm algum método para identificar consultas lentas.
Ao usá-lo regularmente, você poderá interceptar todas as consultas com problemas com amplo aviso.
Se você trancar sozinho, é outra história, mas não posso ajudar.
fonte
select for update
não existiria se eles fizeram ...