[firebase-br] RES: Otimização de Transação
Luis
luisfirevb em gmail.com
Qui Dez 3 09:24:35 -03 2009
Sandro bom dia.
No meu caso isso não é perfumaria, muito pelo contrário. Porém minha
necessidade é um pouco diferente. Não se trata de reaproveitamento dos
números ou preenchimento de lacunas, mas não deixar a sequência se quebrar
explico.
Trabalho com auditoria de normas técnicas e a gestão das mesmas implica em
rastreabilidade. Sendo assim os controles realizados, devem obrigatoriamente
seguir uma sequência sem lacunas, pois se houver lacunas pode ser assumido
que houve exclusão de uma informação importante para ser ocultada, mesmo que
manualmente no banco. Assim essa numeração não pode "falhar". Exemplo: Um
dos controles é reclamação de clientes, essas reclamações devem ser
cadastradas e tem seu processo normalmente, com apuração, ações, aprovação e
verificação final de sua solução. Se houver uma falha um auditor pode
entender como exclusão de informação crítica que compromete o sistema de
controle e não certificar a empresa.
Para evitar isso implementei justamente a forma mais viável, pegar sempre o
último código cadastrado e somar + 1, se na hora de gravar alguém fez isso
miléssimos de segundos antes, então haverá um erro retornável, o sistema
interceptará e realizará nova tentativa + 2 e assim até conseguir gravar.
Até hoje não encontrei outra solução mais viável que essa para evitar
buracos na numeração.
Luis
-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Sandro Souza
Enviada em: quinta-feira, 3 de dezembro de 2009 02:15
Para: FireBase; Josauro S. J.
Assunto: Re: [firebase-br] Otimização de Transação
Bom dia/tarde Josauro.
No meu caso, faço tudo dentro de uma única transação, mas como você
mesmo citou, o problema de dois ou mais usuários tentarem utilizar o
mesmo código devido à concorrência existe realmente. A única vantagem,
no meu caso, é não necessitar de uma tabela de códigos reaproveitáveis,
mas no restante, não foge dos problemas que você já está passando.
Como já foi citado várias vezes em outros posts, o uso de
geradores/sequences poderia realmente resolver essa questão de
concorrência, mas por outro lado, fugiria a reutilização de códigos como
é o nosso caso.
Uma outra abordagem poderia ser a seguinte:
1 - Todas as chaves estrangeiras seriam criadas utilizando a opção "ON
UPDATE CASCADE".
2 - Utilizaríamos geradores/sequences, e dessa forma, nas inclusões não
reutilizaríamos mais os códigos excluídos, ganhando performance e nos
livrando de problemas de concorrência no que se refere ao uso do mesmo
código.
3 - Criaríamos uma stored procedure que seria acionada sempre que
desejássemos encontrar essas "brechas" de código em cada uma das tabelas
dos nossos bancos, e encontrando-as, executaria UPDATEs nesses campos
chaves para efetuar as "correções" e rearrumar os códigos para deixar
tudo sequencial e sem essas "brechas". Como as chaves estrangeiras
teriam sido criadas com a opção "ON UPDATE CASCADE" (item 1), esses
mesmos códigos nas tabelas filhas/detalhes seriam automaticamente
alinhados/ajustados pelo próprio banco. Para caad tabela que sofreu
ajustes de código, seu respectivo gerador/sequence também seria reajustado.
Dessa forma, eu acredito que teriamos uma forma melhor de conseguir o
que pretendemos.
Sei que o fato de deixar essas "brechas" de código não tem realmente
qualquer impacto negativo no sistema, que viveria tranquilamente com
isso, e que essa necessidade de manter todos os códigos em ordem
sequencial e sem "brechas" é apenas questão de gosto pessoal,
"perfumaria" ou simplesmente ter a sensação de que tudo está organizado
no banco, e que só haveria necessidade real disso se por acaso
tivéssemos tabelas com tantos registros que poderia acontecer de esgotar
os valores disponíveis para os campos chaves.
No meu caso específico, assumo que se trata apenas de gosto pessoal mesmo.
Josauro, o que você acha dessa nova abordagem?
Espero ter ajudado mais que atrapalhado. :D
Josauro S.J. escreveu:
Mais detalhes sobre a lista de discussão lista