javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional

时间:2014-10-15 16:22:40

标签: java spring hibernate transactions jta

我不明白注释javax.transaction.Transactionalorg.springframework.transaction.annotation.Transactional之间的实际区别是什么?

org.springframework.transaction.annotation.Transactional的延伸是javax.transaction.Transactional还是它们的含义完全不同?应该何时使用它们?服务层中的Spring @Transactinal和DAO中的 javax

感谢您的回答。

4 个答案:

答案 0 :(得分:83)

几年前,Spring已经定义了自己的Transactional注释来使Spring bean方法成为事务性的。

Java EE 7最终完成了同样的事情,现在除了EJB方法之外,还允许CDI bean方法是事务性的。所以从Java EE 7开始,它也定义了自己的Transactional注释(显然它不能重用Spring)。

在Java EE 7应用程序中,您将使用Java EE注释。

在Spring应用程序中,您将使用Spring注释。

它们的用法是相同的:通知容器(Java EE或Spring)方法是事务性的。

答案 1 :(得分:38)

另一个区别是Spring如何处理@Transactional注释

    始终考虑
  • org.springframework.transaction.annotation.Transactional
  • 只有存在EJB3事务时才会考虑
  • javax.transaction.Transactional 。 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),它不提供{ {1}}。

答案 2 :(得分:24)

请小心,(这个问题发生在tomcat),

如果您的应用程序是SPRING Web应用程序并且您使用的是@org.springframework.transaction.annotation.Transactional的Spring事务处理机制,那么请不要将它与javax.transaction.Transactional混合使用。

始终在spring应用程序中始终使用@org.springframework.transaction.annotation.Transactional

否则我们可能会遇到此错误,

org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed

........

Caused by: java.sql.SQLException: Protocol violation: [0]

答案 3 :(得分:8)

声明式交易范围

Spring和JPA @Transaction批注均允许您定义给定应用程序事务的范围。

因此,如果使用@Transactional注释对服务方法进行注释,则它将在事务上下文中运行。如果服务方法使用多个DAO或存储库,则所有读取和写入操作将在同一数据库事务中执行。

春天@Transactional

org.springframework.transaction.annotation.Transactional注释自Spring框架的1.2版本(大约在2005年)开始可用,它允许您设置以下事务属性:

  • isolation:基础数据库隔离级别
  • noRollbackFornoRollbackForClassName:可在不触发事务回滚的情况下触发的Java Exception类的列表
  • rollbackForrollbackForClassName:Java Exception类的列表,这些类在引发时会触发事务回滚
  • propagation:由Propagation枚举给出的事务传播类型。例如,如果可以继承事务上下文(例如,REQUIRED),或者应该创建新的事务上下文(例如,REQUIRES_NEW),或者如果不存在事务上下文,则应该引发异常(例如MANDATORY),或者如果找到当前事务上下文(例如NOT_SUPPORTED)则抛出异常。
  • readOnly:当前事务是否只应读取数据而不应用任何更改。
  • timeout:应该允许事务上下文运行多少秒,直到引发超时异常。
  • valuetransactionManager:绑定事务上下文时将使用的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枚举给出的传播策略。例如,如果可以继承事务上下文(例如,REQUIRED),或者应该创建新的事务上下文(例如,REQUIRES_NEW),或者如果不存在事务上下文,则应该引发异常(例如MANDATORY),或者如果找到当前事务上下文(例如NOT_SUPPORTED)则抛出异常。

选择哪一个?

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

如果单独使用Java EE,并且将应用程序部署在Java EE应用程序服务器上,请使用Java EE @Transactional批注。

有关使用Spring或Java EE @Transactional定义时隔离级别配置如何不同的更多详细信息,请查看this article