Transações declarativas autocoméricas e de primavera
-
27-09-2019 - |
Pergunta
Eu tenho um único método de serviço anotado com Propagation.Required
. Ele realiza três operações separadas.
- Insira na Tabela 1 da Tabela Z se nenhum registro estiver na Tabela 1
- Insira/atualização Tabela 1 conforme edições/adições do usuário
- 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.
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.