Spring中的@Transactional和JPA中的@Transactional之间的区别

11 浏览
0 Comments

Spring中的@Transactional和JPA中的@Transactional之间的区别

我不明白javax.transaction.Transactional和org.springframework.transaction.annotation.Transactional之间的实际区别是什么?\norg.springframework.transaction.annotation.Transactional是javax.transaction.Transactional的扩展,还是它们具有完全不同的意义?应该在什么时候使用它们?在服务层使用Spring的@Transactional,在DAO层使用javax的?\n谢谢回答。

0
0 Comments

问题的出现的原因是要比较并解释Spring中的@Transactional注解和JPA中的@Transactional注解之间的区别。解决方法是通过列出Spring和JPA的注解属性来进行比较,并提供选择注解的建议。

声明性事务范围

Spring和JPA的@Transactional注解都允许您定义给定应用程序事务的范围。因此,如果一个服务方法被注解为@Transactional,它将在事务上下文中运行。如果服务方法使用多个DAO或Repositories,所有读写操作将在同一个数据库事务中执行。

Spring @Transactional

Spring的org.springframework.transaction.annotation.Transactional注解自从Spring框架的1.2版本(大约在2005年)中就可用了,并且它允许您设置以下事务属性:

- isolation:底层数据库的隔离级别

- noRollbackFor和noRollbackForClassName:可以触发而不触发事务回滚的Java Exception类的列表

- rollbackFor和rollbackForClassName:抛出时触发事务回滚的Java Exception类的列表

- propagation:由Propagation Enum给出的事务传播类型。例如,如果事务上下文可以继承(例如REQUIRED),或者应该创建一个新的事务上下文(例如REQUIRES_NEW),或者如果没有事务上下文存在则抛出异常(例如MANDATORY),或者如果找到当前事务上下文则抛出异常(例如NOT_SUPPORTED)。

- readOnly:当前事务是否只读取数据而不应用任何更改。

- timeout:事务上下文允许运行的秒数,直到抛出超时异常。

- value或transactionManager:绑定事务上下文时要使用的Spring TransactionManager bean的名称。

Java EE @Transactional

javax.transaction.Transactional注解是由Java EE 7规范(大约在2013年)添加的。因此,Java EE注解比Spring注解晚了8年。

Java EE @Transactional只定义了3个属性:

- dontRollbackOn:可以触发而不触发事务回滚的Java Exception类的列表

- rollbackOn:抛出时触发事务回滚的Java Exception类的列表

- value:传播策略,由TxType Enum给出。例如,如果事务上下文可以继承(例如REQUIRED),或者应该创建一个新的事务上下文(例如REQUIRES_NEW),或者如果没有事务上下文存在则抛出异常(例如MANDATORY),或者如果找到当前事务上下文则抛出异常(例如NOT_SUPPORTED)。

应该选择哪一个?

如果您使用的是Spring或Spring Boot,则使用Spring @Transactional注解,因为它允许您配置比Java EE @Transactional注解更多的属性。

如果您仅使用Java EE,并且在Java EE应用程序服务器上部署应用程序,则使用Java EE @Transactional注解。

Java/Jakarta EE @Transactional注解对私有方法有效吗?

很可能不会有效。事务边界应该在从不同层(如Web或调度程序)调用服务时开始。

实际上,我已经在同一个类中使用委托方法来注解方法。我知道我可以将注解移动到该委托方法,但是我对此很好奇,但是我在网上没有找到任何信息。

私有方法不计数。只有跨服务方法才适用于传播规则。

以上为中文翻译的整理文章。

0
0 Comments

在Spring中,@Transactional注解和JPA中的@Transactional注解之间存在一些差异。其中一个差异是Spring如何处理这些注解。

首先,org.springframework.transaction.annotation.Transactional注解总是会被考虑。无论何时使用这个注解,Spring都会对其进行处理。

其次,javax.transaction.Transactional注解只有在存在EJB3事务时才会被考虑。判断是否存在EJB3事务是通过检查类路径中是否有javax.ejb.TransactionAttribute类来完成的。这种判断方法在版本2.5.3至3.2.5中被使用。

因此,如果类路径中只有javax.transaction.Transactional而没有javax.ejb.TransactionAttribute,那么您的注解可能不会被考虑。这种情况可能发生在使用Hibernate时:hibernate-core(4.3.7.Final)依赖于jboss-transaction-api_1.2_spec(1.0.0.Final),而后者并不提供javax.ejb.TransactionAttribute。

然而,我认为这在Spring 4.2.0中已经不再是一个问题了。在该版本中,javax.transaction.Transactional注解也被支持作为Spring自己注解的替代品。

需要注意的是,如果注解被应用在私有方法上,那么它可能不会被考虑。

通过Spring进行事务管理时,对于不同的@Transactional注解,处理方式存在差异。在某些情况下,需要注意注解的使用和版本兼容性。

0
0 Comments

Spring和JPA中的@Transactional之间的区别

Spring和JPA都定义了自己的@Transactional注解,用于将方法标记为事务性。然而,由于Java EE 7引入了与EJB方法一样的事务性支持,所以它也定义了自己的@Transactional注解。因此,从Java EE 7开始,可以在CDI bean方法中使用Java EE的注解,而不仅限于EJB方法。在Spring应用程序中,仍然使用Spring的注解。

这两个注解的使用方式是一样的,都是用来告知容器(Java EE或Spring)一个方法是事务性的。

然而,Spring为了扩展性的考虑,还添加了对javax.transaction.Transactional的隐式支持,这样在Spring应用程序中也可以使用它,而无需任何额外的操作。但是,从设计的角度来看,我认为这是一个相当糟糕的决定,因为根据我的经验,很多开发人员在代码中会不自觉地混淆这两个注解,从而导致后续的问题。

此外,org.springframework.transaction.annotation.Transactional提供了比javax.transaction.Transactional更多的选项,例如readOnly和timeout。

由于这些问题,开发人员在代码中可能会遇到以下问题:

1. 混淆注解:开发人员可能会错误地使用了错误的注解,从而导致事务处理不符合预期。

2. 缺少选项:如果开发人员在Spring应用程序中使用了javax.transaction.Transactional注解,他们将无法使用Spring提供的额外选项,这可能会导致功能上的限制。

总之,尽管Spring和JPA都有自己的@Transactional注解,但使用时需要注意区别,并根据具体的应用环境选择正确的注解。

0