Spring - Controlando Transações com StoredProcedure

3 respostas
Leonardo_Gaona

Boa tarde pessoal,

Estou enfrentando um problema aqui com o sistema que assumi recentemente para dar manutenção.

Por política da empresa, todo o acesso a base de dados é feita via Stored Procedures ( Utilizamos SQL Server 2008 ). Os desenvolvedores do projeto criaram então classes que herdam de StoredProcedure do Spring para executar os métodos de acesso a dados.

Entretanto, encontrei uma grave falha no design e não sei como corrigir isso. Tenho um método em uma classe que realiza as seguintes funções:

[list]Cria um projeto, registrando-o no banco de dados A[/list]
[list]Gera um chamado solicitando uma OI (ordem de investimento), registrando os dados no banco de dados B (através de uma SP executada na base A)[/list]
[list]Retorna uma mensagem de sucesso ao usuário e envia um e-mail com a descrição do chamado[/list]

Entretanto, se por acaso o projeto for criado com sucesso (métodoA) mas ocorrer uma falha na abertura de chamado(métodoB), mesmo tratando a Exception gerada pelo métodoB, não consigo efetuar o rollback das mudanças realizadas pelo métodoA.

Existe algum modo de criar uma transação com o banco no escopo do método, executar a minha lógica de negócio e só então realizar o commit das informações?

Não possuo muito conhecimento de Spring, mas andei pesquisando e aparentemente uma implementação de JTA poderia resolver o meu problema, alguma sugestão?

Agradeço desde já,

Um abraço à todos! Obrigado =]

3 Respostas

Kenobi

O JTA propaga o contexo transacional através do seu driver JDBC XA, por tanto, se você acessa as Procs com um driver que não o suporta, vamos encarar dessa maneira, não conseguirá criar o “rollback”.

Nestes casos, utilizamos uma “compensação”, seria um fluxo alternativo de implementação caso aconteça um erro, literalmente desfazendo as operações anteriores chamando os métodos antônimos - delete no caso.

Sugiro controlar o estado desses dois ambientes distintos através de uma classe separada (máquina de estados) e ao final do fluxo, com tudo certo, disparar o e-mail de sucesso.

Isso poderia ser craido ainda através de um Proxy AOP com Spring, mas acho melhor fazer da maneira mais simples :slight_smile:

Um abraço,

Kenobi

Leonardo_Gaona

Kenobi:
O JTA propaga o contexo transacional através do seu driver JDBC XA, por tanto, se você acessa as Procs com um driver que não o suporta, vamos encarar dessa maneira, não conseguirá criar o “rollback”.

Nestes casos, utilizamos uma “compensação”, seria um fluxo alternativo de implementação caso aconteça um erro, literalmente desfazendo as operações anteriores chamando os métodos antônimos - delete no caso.

Sugiro controlar o estado desses dois ambientes distintos através de uma classe separada (máquina de estados) e ao final do fluxo, com tudo certo, disparar o e-mail de sucesso.

Isso poderia ser craido ainda através de um Proxy AOP com Spring, mas acho melhor fazer da maneira mais simples :slight_smile:

Um abraço,

Kenobi

Então para que eu consiga essa propagação de contexto transacional, precisaria utilizar um driver JDBC XA de uma das implementações da JTA? Seria necessário mais alguma configuração como por exemplo arquivos xml?

OBS: Encontrei aqui uma implementação da JBoss, vou consultar a documentação.

Abraço!

Kenobi

Vc precisaria sim do driver e configurará-lo junto ao Application Server. Cada produto tem sua particularidade, alguns como GlassFish e Weblogic, possuem um manager com opções bastante ricas.

Quanto ao Spring, deverá também fazer configuração e definir tipo de isolamento da transação e tudo mais :-).

Criado 27 de janeiro de 2011
Ultima resposta 29 de jan. de 2011
Respostas 3
Participantes 2