Pergunta

Eu tenho um único método de serviço anotado com Propagation.Required. Ele realiza três operações separadas.

  1. Insira na Tabela 1 da Tabela Z se nenhum registro estiver na Tabela 1
  2. Insira/atualização Tabela 1 conforme edições/adições do usuário
  3. Exclua os registros X da Tabela 1

Perdoe minha ignorância, mas tudo isso não deve correr sob uma única transação? No sentido, se a terceira consulta estiver em uma exceção, a primeira e a segunda reversão também não deveriam? Isso não acontece no meu caso. A configuração de comprometimento automático do hibernato afetará os limites do TXN de alguma forma? O commit automático está definido como verdadeiro no meu caso. O que eu preciso é que a confirmação deve ocorrer em qualquer uma dessas tabelas apenas se todas forem bem -sucedidas.

Foi útil?

Solução

Sim, o hibernato connection.autocommit A configuração da propriedade afetará os limites da transação.

Se você definir isso como true, O Hibernate colocará a conexão JDBC subjacente no modo autocomit, que envolverá cada instrução que você executará em sua própria transação de banco de dados.

Por exemplo, se sua terceira consulta/declaração falhar, apenas sua terceira consulta/declaração será revertida.

Para executar todos os três como uma única unidade, você precisa ter auto -comprometer e executar todos os três no contexto de uma única transação, declarativa ou não.

Outras dicas

Você poderia tentar adicionar mais uma camada superior à camada de serviço e iniciar a transação a partir daí.

Você definitivamente não quer autocomit. Isso provavelmente se comprometerá após cada operação. Desligue o AutoComit desligado e adicione uma confirmação explícita no final.

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