xiru Sat, 20 May 2006 06:39:28 -0700
O ZODB não trabalha com o modelo de tratamento de colisões de transações através de bloqueios. Esse modelo é pessimista e prejudicaria muito a performance de uma vasta gama de aplicações web.
Aplicações web são um pouco diferentes de aplicações relacionais em geral, pois a relação leituras (acessos ao site) e gravações (modificações de informações) costuma pesar muito mais para as leituras. Dessa forma, usar bloqueios iria contra a lógica. O que o ZODB usa é um sistema de tratamento de colisões baseado em timestamps (otimista). Ele parte do presuposto que em 99,99% do tempo não há transações colidindo e isso é muito bom. As versões do ZODB mais recentes ainda implementam uma abordagem MVC (multi-version) que minimiza ainda mais a os problemas.
O que você deve providenciar é uma forma de sua aplicação não dar esses conflict erros. Se voce tem um script qualquer que leva 2 minutos para rodar e altera objetos e, durante esse tempo, há pessoas acessando o mesmo dado que está sendo alterado, você está pendindo para tomar pancada.
Eis algumas formas de mitigar os problemas:
1) Usar um ZODB MVC que vem o Zope 2.8. Isso não resolve o problema, mas ajuda bastante.
2) Otimizar ao maximo o processamento da transação que altera dados. Se isso não for possível, pense em fazer isso num horário onde há menos gente acessando (madrugada?). Se voce tem que fazer isso a cada 5 minutos, bem... ai comeca a ficar dificil, mas mesmo assim há soluções.
3) Um solução seria usar subtransacoes. O ZODB permite que, a medida que voce for fazendo sua transacao, que voce de commit parciais. Isso significa que, se depois de 1 minuto de processamento houver um conflito, voce nao precisa dar rollback de toda transacao. Obviamente isso influencia na forma como voce deve enxergar o funcionamento de seu programa, mas transacoes de longa duração são chatas mesmo.
Por fim, tenha ciencia que, mesmo usando um esquema de bloqueios estritos (como o que Oracle usa, por exemplo) seu problema ainda aconteceria. Ter uma transacao que dura minutos com muita gente lendo dados SEMPRE impactara negativamente na performance de qualquer banco de dados. Em alguns esse impacto é menor do que outros, mas não existe solução perfeita (alias existe...desenvolver aplicações/plataformas que se preocupem com isso e prevejam isso nos seus projetos).