Thingol, eu tava refletindo sobre o que vc disse:
[quote=thingol]Tem muita gente que dá um select antes de dar um insert, mas eu não recomendaria isso justamente se houver mais de um programa ou uma thread acessando a mesma base - é que nem sempre você pode garantir que no intervalo de tempo entre dar o tal select para ver se o registro já existe e dar o insert (ou update) algum outro programa oi thread não vai fazer isso antes de você.
Por incrível que pareça, é melhor dar o insert, examinar a exceção (SQLException e ver se é alguma coisa do tipo “Chave duplicada”), e se for isso, dar o update. [/quote]
Cheguei a conclusão de que independente da forma a ser implementada teriamos problema, e que casos como esse que vc citou já começa a entrar no mérito de lock de transação, e para esse assunto tem dias de discussão que é quase dificil terminar. Penso que, independente de ter feito o teste com select (logo acima) ou tratado no catch exception, nada garante o estado do registro no banco… Precisaria de um delay bem grande entre o tratamento de catch e o insert (no caso dela), mas pode até ocorrer do registro ser excluído por outro usuário antes mesmo do update dela dentro do tratamento da chave duplicada. Aí seria até pior, pois quando ela tentou o insert o sistema disse que já existia, lançando a exception, e quando ele foi pro catch… outra transação removeu o registro, impossibilidando o update.
É um assuntos bem “chato”, mas geralmente dá “pano pra manga” em desenvolvimento.
Mas, acho que o meio termo (pra não dizer, o termo inteiro, ahuahuaha) seria utilizar algum framework de persistência que ajudasse a implementar isso, principalmente pelo fato de neste caso não haver mais a necessidade de se preocupar com código X ou Y de erros implementados diferentemente para cada tipo de banco de dados.
No mais, acho que se a Giuliana continuar com o sistema mais simples com JDBC puro mesmo, acho que ela podia pelo menos fazer um “SELECT FOR UPDATE” antes de deletar ou fazer update no registro, garantindo o lock sobre a tupla (isso é velho hein…).