您会使用AOP进行数据库事务管理吗?

时间:2009-03-08 22:40:38

标签: java database spring transactions aop

前段时间我写了一个应用程序,它使用Spring AOP来定义哪些方法是事务性的。我现在想到这是多么伟大的想法;在一个次要的重构(改变方法签名等)之后我被击中了几次,当然在出现问题之前不会显而易见(并且我有一个逻辑上不一致的数据库)。

所以我对以下几点感兴趣:

  1. 让其他人决定恢复显式交易管理(例如通过@Transactional注释)吗?
  2. 我是否可以使用有用的工具作为构建过程的一部分来帮助确定是否有任何“损坏”?
  3. 如果人们使用AOP来管理交易,他们采取了哪些措施来避免我犯的错误?
  4. 我正在使用IntelliJ IDEA,它允许您浏览修饰的方法,并将Spring XML配置与方法名称更改一起重构,但这并不总是足够的(在错误的位置向方法添加参数可以影响一个方面是否会触发例如)

3 个答案:

答案 0 :(得分:4)

我目前在我工作的两个Java项目中使用声明式事务管理,指定哪些方法需要具有@Transactional注释的事务范围。在我看来,它是灵活性和健壮性的良好组合:您可以通过简单的文本搜索查看哪些方法具有事务行为,如果需要可以手动调整隔离和传播属性,并且额外的键入量实际上是疏忽的

在其中一个项目中,我通过各方面实施安全/日志记录,并且在重命名方法或更改签名时偶尔会遇到相同的障碍。在最糟糕的情况下,我丢失了一些用户访问合同的日志记录数据,在一个版本中,一些用户角色无法访问所有应用程序功能。没什么大不了的,但是,就数据库事务而言,我认为它根本不值得,而且我最好自己键入@Transactional位。无论如何,春天确实很难。

答案 1 :(得分:2)

关于(1): 我发现@Transactonal在过去几年中所有项目中都是一个更实用的解决方案。但是,在某些非常特殊的情况下,我还必须使用Spring AOP来允许使用多个JDBC连接/ TransactionManager,因为@Transaction绑定到单个事务管理器。

关于(2): 话虽如此,在混合场景中,我做了很多自动化测试,以找到可能损坏的代码。我使用Spring的AbstractTransactionalJUnit4SpringContextTests / AbstractTransactionalTestNGSpringContextTests来创建我的测试。到目前为止,这是一个非常有效的解决方案。

答案 2 :(得分:0)

我倾向于更多的纯粹主义者,但我试图在数据库本身内部保持任何和所有事务管理超越简单的自动提交。毕竟,大多数数据库都非常适合处理事务管理,它是数据库所要做的关键组件之一。