Melhor maneira de gerenciar transações
-
07-07-2019 - |
Pergunta
Eu tenho o sistema baseado JBoss e Hibernate. E eu preciso para processar duas operações longas. As operações podem ser, provavelmente, mais do que o tempo limite de transação. Ele operações são persiste muitos-muitos entidades, em duas operações diferentes. E se algo der errado, durante estas operações, eu deveria reverter todas as alterações das transações.
Qual é a melhor maneira de resolvê-lo?
Eu acho que, a melhor maneira é juntar todas as operações de uma transação, mas ele necessita para definir o tempo limite de transação de comprimento, e é inaceitável para o nosso sistema.
É a gestão de muitas transações melhor nesta situação. E como eu posso fazê-lo?
Solução
Você pode usar um servidor JTA (coordenador de transação) para fazer a transação em várias etapas com transações XA? Esta postagem tem um pouco de fan- para um par de pessoas open-source que o trabalho poder para você.
transações XA permitem que você faça um monte de operações menores e cometem ou back roll-los em um hit. Tente googling para 'hibernar xa de operações'. A maioria das plataformas RDBMS modernos (MySQL 5.x, PostgreSQL, SQL Server, Oracle, DB2, Sybase etc.) operações de apoio XA.
Outras dicas
Usando uma transação é boa, robusta e assim por diante. Tente novamente para convencer seu administrador; -)
Caso contrário, eu posso pensar em:
- usando transações mais curtas para inserir menos linhas, usando um marcador para significar "incompleta ??strong>". Isto poderia estar em uma coluna existente ou um novo (talvez poderia ser em uma tabela diferente?).
- se quaisquer reversões de transações, tente novamente; se você preferir para abortar a operação inteira, você pode escolher excluir as linhas que têm o "incompleto" marcador.
- quando todas as transações são comprometidos, você pode abrir uma última transação, apenas para marcar todas as linhas como "completa" (ex:
update ... where ...
). Isso deve ser muito mais rápido do que a inserção total foi, por isso, a transação deve ser curto o suficiente.
Eu tinha que fazer algo semelhante em JPA (via hibernate). Eu fiz a operação em transações N em vez de 1 grande transação. Esta operação correu raramente - era um trabalho automatizado -. Então não havia nenhum usuário espera em uma página web para um resultado
Quanto tempo você espera que a transação tomar? Quanto tempo você espera que o usuário esperar ?? Quantas vezes você esperar esta operação para ocorrer. Talvez você esteja requisitos não são claros.