Java Spring@Transactional注释类或方法

Java Spring@Transactional注释类或方法,java,spring,transactions,Java,Spring,Transactions,试图收集和理解@Transactional annotation的要点,并跨越了一个要点。因此,在使用事务性注释时,我们需要记住的主要事项是: 事务性注释只能应用于公共方法[根据 事务性注释应该应用于具体的类,而不是接口[根据 事务性注释应应用于服务级别[根据 如果您想在注释整个类时将某些公共方法从事务性注释中排除,则可以使用一些传播策略[根据 遗憾的是,我没有找到问题的答案:在哪里更好地把事务性注释放在课堂或方法上?我们可以考虑不同的情况,但我最感兴趣的是,当我们有几种方法时,必须有这种注释,

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

  • 事务性注释只能应用于公共方法[根据
  • 事务性注释应该应用于具体的类,而不是接口[根据
  • 事务性注释应应用于服务级别[根据
  • 如果您想在注释整个类时将某些公共方法从事务性注释中排除,则可以使用一些传播策略[根据
  • 遗憾的是,我没有找到问题的答案:在哪里更好地把事务性注释放在课堂或方法上?我们可以考虑不同的情况,但我最感兴趣的是,当我们有几种方法时,必须有这种注释,而有些则没有。
    另外,也许你想在这个列表中添加一些要点,那将是非常棒的。

    这里是我能想到的优点和缺点的列表

    Pro方法级别:

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

    • 减少重复性:如果将注释放在类级别,则不必对每个事务性方法进行注释。有些人认为,将注释放在每个事务性方法上是违反DRY原则的。然而,IMHO,如果这违反了DRY原则,那么Java的私有/受保护/公共modif我也是

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

    1不再是真的,并且已经有一段时间没有出现过。如果您se Spring的编织支持(编译时或加载时)注释可以在任何方法上。如果您的某些方法不需要该注释,这意味着您根本不需要事务,如果我说得对的话。那么,如果您在类上声明事务,为什么还要通过注释打开它呢?我建议只在所有需要事务的方法上编写该注释动作。@BoristheSpider,这是一个有趣的事实,谢谢。@Jan,这就是重点。如果我有很多方法需要是事务性的,我觉得如果我将事务性注释放在所有这些方法上而不是类上,这是一种重复的代码。我只是猜测,如果将它放在类上,即使其他一些方法r方法不需要事务性。在这种情况下,代码重复并不重要。在您的情况下,IMHO事务不应该被视为一个交叉关注点,因为有时它们是不需要的。在更一般的意义上,我总是避免在类级别上进行事务注释,并定义在您的事务中执行您需要执行的操作的方法,这就是如果我们将事务放在类级别而不是方法级别,是否存在与性能相关的问题?