【问题标题】:Spring @Transactional Annotation class or methodSpring @Transactional 注解类或方法
【发布时间】:2015-05-15 16:08:47
【问题描述】:

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

  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. 如果你想在整个类被注释时排除一些公共方法被 Transactional 注释,你可以使用一些传播策略 [根据Transactional annotation on whole class + excluding a single method

不幸的是,我没有找到问题的答案:将事务注释放在类或方法中更好吗?我们可以考虑不同的情况,但主要是我对一个当我们有几个方法必须有这个注解而一些没有的时候。

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

【问题讨论】:

  • 1 不再是真的,而且已经有一段时间了。如果您使用 Spring 的编织支持(编译时或加载时),则注释可以在 any 方法上。
  • 好吧,如果您的某些方法不需要该注释,这意味着如果我让您正确的话,您根本不需要事务。那么,如果您在课堂上声明事务,为什么还要通过注释打开事务呢?我建议只在需要事务的所有方法上编写该注释。
  • @BoristheSpider,这是一个有趣的事实,谢谢。
  • @Jan,这就是重点。如果我有很多需要事务性的方法,如果我将事务性注释放在所有这些方法而不是类上,我觉得这是一种重复的代码。我只是在猜测将它放到类中是否不好,即使其他一些方法不需要事务。
  • 在这种情况下,代码重复无关紧要。恕我直言,在您的情况下,交易不应被视为横切关注点,因为有时不需要它们。从更一般的意义上说,我总是会避免在类级别上进行事务注释,并定义方法来执行您在事务中需要做的事情,这将有利于关注点和可测试性的明确分离

标签: java spring transactions


【解决方案1】:

这是我能想到的利弊列表。

专业方法级别:

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

专业级:

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

【讨论】:

  • 如果我们将事务放在类级别而不是方法级别,是否会出现任何与性能相关的问题?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-18
    • 2019-02-18
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2021-02-11
    • 1970-01-01
    相关资源
    最近更新 更多