Spring @Transactional 注解类或方法

Ruf*_*ufi 5 java spring transactions

试图收集和理解@Transactional注解的要点,并跨越了一个点。因此,在使用 Transactional 注释时,我们需要记住的主要事项是:

  1. 事务注释只能应用于公共方法[根据Spring @Transactional 属性是否适用于私有方法?
  2. 事务注释应该应用于具体类而不是接口 [根据我应该把@Transactional 注释放在哪里:在接口定义还是在实现类?
  3. 事务注释应该应用在服务级别[根据Spring @Transactional Annotation Best Practice
  4. 如果你想在整个类被注释时排除一些公共方法被事务性注释,你可以使用一些传播策略[根据整个类的事务性注释+排除单个方法

不幸的是,我没有找到这个问题的答案:最好将事务注释放在类还是方法中?我们可以考虑不同的情况,但我最感兴趣的是当我们有几种方法必须有这个注释而有些方法没有时。

另外,也许您想在此列表中添加一些要点,那真的很棒。

yam*_*ass 3

这是我能想到的优点和(隐含的)缺点的列表。

专业方法级别:

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

专业级:

  • 减少重复:如果将注释放在类级别,则不必注释每个事务方法。有些人认为在每个事务方法上都添加注释违反了 DRY 原则。然而,恕我直言,如果这违反了 DRY 原则,那么 Java 的 private/protected/public 修饰符也是如此。