Answers:
几年前,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)方法是事务性的。
org.springframework.transaction.annotation.Transactional
提供的选项(如readOnly
,timeout
)要多于javax.transaction.Transactional
另一个区别是Spring处理@Transactional批注的方式
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
。请小心,(此问题发生在tomcat中),
如果您的应用程序是SPRING Web应用程序,并且您正在使用Spring的事务处理机制, @org.springframework.transaction.annotation.Transactional
则不要将其与javax.transaction.Transactional混合使用。
始终@org.springframework.transaction.annotation.Transactional
在Spring应用程序中始终使用 。
否则我们可能会遇到此错误,
org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed
........
Caused by: java.sql.SQLException: Protocol violation: [0]
Spring和JPA @Transaction
批注均允许您定义给定应用程序事务的范围。
因此,如果服务方法带有@Transactional
注释,则它将在事务上下文中运行。如果服务方法使用多个DAO或存储库,则所有读取广告的写操作将在同一数据库事务中执行。
@Transactional
org.springframework.transaction.annotation.Transactional
自从Spring框架的1.2版本(大约在2005年)以来,该注释已可用,它允许您设置以下事务属性:
isolation
:基础数据库隔离级别noRollbackFor
和noRollbackForClassName
:Exception
可以在不触发事务回滚的情况下触发的Java 类的列表rollbackFor
和rollbackForClassName
:Exception
被抛出时触发事务回滚的Java 类的列表propagation
:由Propagation
Enum 给出的事务传播类型。例如,如果可以继承事务上下文(例如REQUIRED
),或者应该创建新的事务上下文(例如REQUIRES_NEW
),或者如果不存在事务上下文则抛出异常(例如MANDATORY
),或者应该引发异常如果找到当前交易上下文(例如NOT_SUPPORTED
)。readOnly
:当前事务是否仅应读取数据而不进行任何更改。timeout
:应允许事务上下文运行多少秒,直到引发超时异常。value
或transactionManager
:TransactionManager
绑定事务上下文时要使用的Spring bean 的名称。@Transactional
该javax.transaction.Transactional
批注由Java EE 7规范(大约在2013年)添加。因此,Java EE注释是在其Spring对应注释的8年后添加的。
Java EE @Transactional
仅定义了3个属性:
dontRollbackOn
:Exception
可以在不触发事务回滚的情况下触发的Java 类的列表rollbackOn
:Exception
抛出时触发事务回滚的Java 类的列表value
:传播策略,由TxType
Enum 给出。例如,如果可以继承事务上下文(例如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
定义时隔离级别配置如何不同的更多详细信息,请参阅本文。
javax.transaction.Transactional
因此现在无需任何其他操作即可在Spring应用程序中使用它。IMO,从设计的角度来看,这是一个非常糟糕的决定,因为根据我的经验,许多开发人员在代码中无意识地混淆了这两者,从而导致后来出现问题。