Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Manipulação de atualizações simultâneas em hibernação


Alguém pode me explicar se usamos spring para o gerenciamento de transações, como as atualizações simultâneas serão tratadas pelo hibernate (gerenciamento automático de versões na memória do hibernate) ou tenho que colocar coluna de versão no banco de dados para cuidar das atualizações simultâneas manualmente.

Se você está usando Spring para gerenciamento de transações ou não, isso realmente não importa e não é relevante quando se trata de gerenciamento de simultaneidade, isso é realmente tratado pelo Hibernate. O Hibernate pode usar 2 estratégias para lidar com atualizações simultâneas:bloqueio otimista e bloqueio pessimista.

Otimista


Ao usar o bloqueio otimista, você mapeia um atributo especial (um número, um carimbo de data/hora) como uma versão (então você realmente tem uma coluna para isso). Esta versão é lida quando você recupera uma entidade e incluída na cláusula where durante uma atualização e incrementada por Hibernate.

Para ilustrar como isso funciona, vamos imaginar que você carregue uma entidade Person por id=1 e com uma versão atual=1. Após salvar, o Hibernate irá executar algo assim:
update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Então, agora, imagine que você tenha duas transações simultâneas em execução, cada uma delas carregando o mesmo entidade (mesmo número de versão) e alterando o nome.

Digamos que a transação nº 1 seja confirmada primeiro, a seguinte consulta é executada:
update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Ele é bem-sucedido e a versão é incrementada.

Em seguida, a transação nº 2 é confirmada, a seguinte consulta é executada:
update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;

Este não atualizará nada porque a cláusula where não corresponderá a nenhum registro. É aqui que você obterá uma exceção de simultaneidade otimista.

Essa estratégia é apropriada quando você não mantém a conexão, quando os acessos simultâneos não são frequentes e escala muito bem. E tudo é tratado de forma transparente pelo Hibernate para você, desde que você mapeie um atributo de versão.

Pessimista


Ao usar o bloqueio pessimista, o Hibernate bloqueia um registro para seu uso exclusivo até que você termine com ele (normalmente usando um SELECT ... FOR UPDATE ). Qualquer outra transação simultânea que tente acessar o mesmo registro será suspensa até que o bloqueio seja removido. Essa estratégia oferece melhor previsibilidade, ao preço do desempenho e não é dimensionada indefinidamente.

Referências

  • Guia de referência do Hibernate Core
    • 11.3. Controle de simultaneidade otimista
    • 11.4. Bloqueio pessimista