Concorrencia de BD! Mantendo a consistencia

BOm… Gostaria de propor um problema e escutar algumas soluções…Acredito que seja um problema recorrente e que existam meios de resolve-lo usando J2EE… Ou qualquer outra tecnologia…
Numa arquitetura cliente servidor, tenho aplicações nas máquinas clientes que compartilham/alteram um banco de dados comum armazenado no servidor.

  1. Qual seria a solução para sempre que um usuário atualizasse a base dados essa atualização fosse enviada para todos os clientes, mantendo a interface visual consisnte?
    Seria um tipo de observer? Existe alguma implementação para isso?

  2. Um outro problema ocorre quando usuário tentam ao mesmo tempo alterar um dado da tabela.
    EX:

  • Usuario A visualiza a tabela 1
  • Usuario B atualiza tabela 1
  • Usuario A, sem ter a view atualizada, escreve na tabela 1 e sobrescreve alterações feitas por usuário B.

Teria quer ser criado um mecanismo de LOCK na tabela? Ou seja quando um usuário estiver visualizando a tabela, com possibilidade de alterar outro usuario nao poderia visualisar?

Utilizando o observer para manter a interface visual consisnte nao necessitariamos do LOCK?

Como resolver esses problemas? Digam suas ideias…

obrigado!

Olá

Para o primeiro problema, não conheço nenhuma solução. Não consigo imaginar uma forma de o banco “avisar” aos clientes que houve alterações no registro de uma tabela. Acho que poderia ser feito um mecanismo síncrono: de tempos em tempos o sistema atualiza os dados exibidos reconsultando-os no banco.

Quanto ao segundo problema, creio que você não precisa dar lock na tabela. Basta configurar o nível de isolamento das transações de forma apropriada. Nesse caso, o que me parece mais adequdo é o READ COMMITED. Consulte a documentação do seu banco.

Se vc solucionar o problema 1, o 2 tambem sera solucionado.

para o primeiro problema. não sei o que vc usa na interface,
recomendo Adobe Flex, utilizando BlaseDS, ele possui um serviço
chamado DATA PUSH, faz exatamente isso que vc quer…
http://forum.flexbrasil.com.br

para o segundo problema(caso ainda precise),
não sei se vc está usando mas
o hibernate possui umas configurações de LOCK, otimista e pessimista
de uma olhada na decumentação…

FLwS

[quote=feltraco]Se vc solucionar o problema 1, o 2 tambem sera solucionado.

para o primeiro problema. não sei o que vc usa na interface,
recomendo Adobe Flex, utilizando BlaseDS, ele possui um serviço
chamado DATA PUSH, faz exatamente isso que vc quer…
http://forum.flexbrasil.com.br

[/quote]

Isso é um pattern, Observer !
busque por isso…

abraços :smiley:

Eae

Se estiver usando JPA, da uma olhada na anotação @Version.

ela pode te ajudar a resolver o problema da concorrência

[]s
Ferry

olá pessoal

entendo como a @Version funciona,

mas o que farei na hora q ocorrer esse objeto obsoleto?
vi q o hibernate lança uma StaleObjectStateExcpetion.

faço um try catch no metodo q faz update da entity e no catch vejo se eh a excessão e aviso o usuario?
ou ja mando o novo objeto pra ele e aviso q esses sao os novos dados?

obrigado desde já