Spring @Transactional Annotation类或方法

时间:2015-03-13 08:31:09

标签: java spring transactions

尝试收集并理解@Transactional注释的要点并交叉一点。因此,在使用Transactional注释时我们需要记住的主要事项是:

  1. 交易注释只能应用于公共方法[根据Does Spring @Transactional attribute work on a private method?
  2. 交易注释应该应用于具体类而不是接口[根据Where should I put @Transactional annotation: at an interface definition or at an implementing class?
  3. 交易注释应在服务级别[根据Spring @Transactional Annotation Best Practice
  4. 应用
  5. 如果要在注释整个类时使用Transactional排除某些公共方法,可以使用一些传播策略[根据Transactional annotation on whole class + excluding a single method
  6. 不幸的是我没有找到问题的答案:将Transactional注释更好地放到类或方法中?我们可以考虑不同的情况,但大多数情况下我感兴趣在我们有几个方法必须有这个注释和一些不要的时候。

    另外,也许你想在这个列表中添加一些点,这真的很棒。

2 个答案:

答案 0 :(得分:2)

这是我能想到的专业人士和(隐含)缺点的清单。

Pro方法级别:

  • 易于阅读:您可以查看一个方法,并且可以判断它是事务性的,而无需查看类,其实现的接口或超类。
  • 明确:注释清楚地告诉您该方法意味着是事务性的。它不仅仅是事务性的,因为类中的所有方法都是事务性的。
  • 减少意外合并(否则)独立事务:如果从(隐式)事务方法调用多个事务方法,则外部事务定义整个事务(除非传播设置为比如REQUIRES_NEW左右)。虽然这在很多情况下都没有问题,但从长远来看,我已经看到项目因此而陷入严重困境。特别是当涉及悲观锁定时,保持事务尽可能独立和小是至关重要的,因此事务只需要很少的锁,并且锁会尽快释放。

专业级别:

  • 重复性较低:如果将注释放在类级别上,则不必为每个事务方法添加注释。有些人认为在每种交易方法上加上注释是违反DRY原则的。 然而,恕我直言,如果这是违反DRY原则,那么Java的私人/受保护/公共修饰符也是。

答案 1 :(得分:0)

在我看来,最好用@Transactional注释分别标记每个方法(以指示此方法正在更新某些内容),而不是标记整个类。这将产生更多代码,并且在某些情况下可能是多余的,但请设想您的服务中有10种方法。这些方法中有九种正在更新某些内容,而其中一种只是阅读。您的代码正在使用ORM(例如Hibernate),并且您的方法中有一些由Hibernate管理的对象。在添加新逻辑期间,您意外地更改了由Hibernate管理的对象中的一个字段。在这种情况下,hibernate将在只能读取的方法中触发更新sql指令。它可能会产生难以发现的错误。