Pergunta

Um tempo atrás eu escrevi um aplicativo que usou Spring AOP para definir quais os métodos foram transacional. Agora estou tendo dúvidas a respeito de quanto de uma grande idéia era; Eu fui atingido algumas vezes após um menor refactor (mudando de método assinaturas etc), o que obviamente não se tornam aparentes até que algo realmente der errado (e eu tenho um banco de dados logicamente inconsistente).

Então, eu estou interessado em algumas coisas:

  1. tem outras pessoas decidiu reverter para gerenciamento de transações explícito (por exemplo, via @Transactional anotações)?
  2. Existem ferramentas úteis que podem ser usados ??como parte de um processo de construção para ajudar a identificar se alguma coisa foi "quebrado"?
  3. Se as pessoas estão usando AOP para gerenciar transações, quais as medidas que estão a tomar para evitar os erros que eu fiz?

Eu estou usando IntelliJ IDEA, que permite que você navegue métodos decorados e refatorar Primavera XML configuração juntamente com mudanças de nome método, mas isso nem sempre é suficiente (adicionando um parâmetro para um método no lugar errado pode afetar se um aspecto incêndios, por exemplo)

Foi útil?

Solução

Atualmente, estou usando o gerenciamento de transações declarativa nos dois projetos Java em que trabalho, especificando quais os métodos precisam escopo transacional com anotação @Transactional. Na minha opinião, é uma boa mistura de flexibilidade e robustez: você é capaz de ver quais os métodos têm comportamento transacional através de uma pesquisa de texto simples, pode ajustar o isolamento e propagação atribui à mão se necessário, e a quantidade adicional de digitação é praticamente negligente .

Em um desses projetos, eu tenho segurança / o log implementada via aspectos e ocasionalmente tropeçou nos mesmos obstáculos que você quando renomear um método ou alterar assinaturas. No pior caso, eu perdi alguns dados de registro de contratos de acesso de usuário, e em um lançamento, algumas funções de usuário não foram capazes de acessar todos os recursos do aplicativo. Nada grave, mas, na medida em que as operações de banco de dados ir, no entanto, eu acho que não é simplesmente vale a pena, e eu é melhor para digitar @Transactional mordeu-se. Primavera faz a parte mais difícil, de qualquer maneira.

Outras dicas

No que diz respeito (1): Eu encontrei @Transactonal uma solução mais prática em todos os projetos trabalharam nos últimos anos. Em alguns casos muito específicos, no entanto, eu também tive que usar Spring AOP para permitir o uso de mais de uma conexão JDBC / TransactionManager porque @Transaction está vinculado a um único gerenciador de transações.

No que diz respeito (2): Dito isto, em um cenário misto, eu faço um monte de testes automatizados para encontrar código possivelmente quebrado. Eu uso AbstractTransactionalJUnit4SpringContextTests de Primavera / AbstractTransactionalTestNGSpringContextTests para criar meus testes. Tem sido uma solução muito eficaz até agora.

I tendem a ser mais de um purista, mas eu tento manter toda e qualquer gerenciamento de transação além de uma simples autocommit, dentro do próprio banco de dados. A maioria dos bancos de dados são excelentes em lidar com o gerenciamento de transações, afinal de contas, é um dos principais componentes do que um banco de dados destina-se a fazer.

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