Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

StaleObjectStateException em atualizações de alta frequência


Parece que você configurou o Hibernate para usar controle de simultaneidade otimista . Isso significa que sua tabela User tem um campo de versão que o Hibernate incrementa a cada atualização de linha.

Muito provavelmente, sua transação começa no início da solicitação HTTP e termina no final da resposta HTTP. Isso significa que o processo de edição de um usuário consiste em duas transações:uma transação para preencher o formulário web e uma transação para salvar as alterações.

Nesse caso, alterar o nível de isolamento do banco de dados não fará nenhum bem. Provavelmente, tudo o que você obterá é pior desempenho e escalabilidade .

Não é ruim ter StaleObjectException s. Ele reflete o mundo real - as pessoas realmente trabalham na mesma coisa de vez em quando e podem ocorrer conflitos. A questão é:quando um conflito é detectado, como você o resolve de uma maneira que satisfaça os usuários finais? Pode ser resolvido sem a assistência do usuário?

As estratégias possíveis podem ser

  • substituir as alterações do usuário anterior (geralmente não o que você deseja - daí a necessidade de controle de simultaneidade),

  • mostrar uma mensagem de erro pedindo ao usuário para atualizar e realizar suas alterações novamente,

  • mesclar automaticamente as alterações sem substituir as alterações do usuário anterior (às vezes possível)

  • informar o usuário sobre a desatualização de seus dados e oferecer a ele uma maneira de mesclar manualmente suas alterações

Tudo depende do contexto.