EJB e Problemas com concorrencia... (se eh que se pode chamar de concorrencia)

[quote=grprado][quote=WalterIM]Outra opção, na verdade a mais clássica de todas, do tipo que se usava no cobol:
Faça um código sql específico, dando lock de verdade quando a primeira edição acontecer e verificando se o registro está em lock quando a segunda leitura para posterior edição for tentada.[/quote]

Eu estou fazendo assim também, mas porque me foi solicitado fazer assim.

Em um ambiente com alguma concorrencia vai dar pau. Ou você acha que usuários não saem para tomar cafézinho e largam o terminal idle no meio de um edit por 30 minutos?
[/quote]
Com certeza a melhor solução é a do lock otimista, mas dei essa sugestão porque o colega que começou a thread deu a entender que não poderia usar o lock otimista e teria que dar a mensagem antes do segundo usuário começar a editar.

Entendi seu ponto sim :slight_smile:

Cada caso tem que ser estudado e bem avaliado. O Pojos in Action tem um capítulo bem legal sobre quatro tipos de lock e quando usa-los.

louds, você provavelmente ainda não pegou um sistema com isso. E acredite, dói dar manutenção numa tralha dessas.

Travas otimistas++[/quote]

Concordo que optimistic locking é muito melhor nesse cenário. Mas se isso for um requisito do sistema, e fizer realmente sentido?

Sem utilizar uma tabela, uma boa forma de fazer isso seria usando memcached para guardar os locks e Comet style AJAX para garantir que não vamos ter locks mortos.

Opa, dai a coisa começa a ficar bem mais interessante. Mas acho que a primeira coisa a fazer é verificar qual tipo de lock é realmente necessário(se optimistic lock serviria nesse caso) ou se realmente, é requisito do sistema avisar o usuário já quando ele entrar no registro. Perder um tempinho avaliando isso pode te poupar dias de manutenção sofrida no futuro.

louds, você provavelmente ainda não pegou um sistema com isso. E acredite, dói dar manutenção numa tralha dessas.

Travas otimistas++[/quote]

Pior que é… Imagina se a máquina do cara desliga ou cai a rede sei lá, no meio da edição do registro. O lock ficou no banco. E agora José?!

A Paz!!

Olá

[quote=paulohbmetal]Pior que é… Imagina se a máquina do cara desliga ou cai a rede sei lá, no meio da edição do registro. O lock ficou no banco. E agora José?!
[/quote]

Antigamente este problema era resolvido facilmente logo na inicialização dos sistema verificando se havia locks travados. A gente guardava uma listinha em arquivo txt.

Na verdade todo este tópico é meio sem sentido. O que se quer fazer é pura perfumaria.

O modo mais normal de trabalhar com atualizações simultâneas é o modo otimista como muitos já escreveram:

  • Se abre o registro para edição de quantos estiverem a fim disto (que geralmente é raro ser mais de um)

  • O primeiro que tenta gravar consegue. Os demais são avisados de que o registro mudou e tchau. Em alguns casos recebem a tela com os novos valores no banco.

  • Em algumas aplicações se permite gravar também a alteração daquele que demorou mais tempo para salvar o registro com a possibilidade de fazer merge. Nunca vi isto mas sei que existe.

[]s
Luca

[quote=Luca]
Antigamente este problema era resolvido facilmente logo na inicialização dos sistema verificando se havia locks travados. A gente guardava uma listinha em arquivo txt.
[]s
Luca[/quote]

No cliente?! :shock: Quando falei da energia cair é no cliente… Bom, só se locar com o id do usuário que locou e logo na reinicialização o mesmo voltar avisando que existem “tarefas” pendentes sei lá…

A Paz!!

Olá

Sim, no cliente com um arquivo TXT criptografado. E ainda com risco dele estar corrompido durante a queda do sistema. Mas já vi sistemas assim.

[]s
Luca

louds, você provavelmente ainda não pegou um sistema com isso. E acredite, dói dar manutenção numa tralha dessas.

Travas otimistas++[/quote]

Pior que é… Imagina se a máquina do cara desliga ou cai a rede sei lá, no meio da edição do registro. O lock ficou no banco. E agora José?!

A Paz!![/quote]

Ele quer esse recurso, então que se vire com os problemas técnicos para implementar.