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?

Foi útil?

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 ". 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top