我不明白注释javax.transaction.Transactional
和org.springframework.transaction.annotation.Transactional
之间的实际区别是什么?
org.springframework.transaction.annotation.Transactional
的延伸是javax.transaction.Transactional
还是它们的含义完全不同?应该何时使用它们?服务层中的Spring @Transactinal
和DAO中的 javax
感谢您的回答。
答案 0 :(得分:83)
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注释
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
:基础数据库隔离级别noRollbackFor
和noRollbackForClassName
:可在不触发事务回滚的情况下触发的Java Exception
类的列表rollbackFor
和rollbackForClassName
:Java Exception
类的列表,这些类在引发时会触发事务回滚propagation
:由Propagation
枚举给出的事务传播类型。例如,如果可以继承事务上下文(例如,REQUIRED
),或者应该创建新的事务上下文(例如,REQUIRES_NEW
),或者如果不存在事务上下文,则应该引发异常(例如MANDATORY
),或者如果找到当前事务上下文(例如NOT_SUPPORTED
)则抛出异常。readOnly
:当前事务是否只应读取数据而不应用任何更改。timeout
:应该允许事务上下文运行多少秒,直到引发超时异常。value
或transactionManager
:绑定事务上下文时将使用的Spring TransactionManager
bean的名称。@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。