Spring Hibernate @Transactional 说明
Spring Hibernate @Transactional clarifications
我对@Transactional 注释有很多困惑。
1) 如果我只使用声明性方法,是否足以将我的服务 class/methods 标记为 @Transactional,或者我是否应该创建配置 bean 和属性,如此 Baeldung article 所示?
2) 在某些情况下,我什至需要使用编程方法,以便能够在我的工作流的特定点显式调用 flush()。在这种情况下,以前的休眠配置定义是强制性的吗?
如果您在 Spring 引导项目上,不,您不需要显式声明 SessionFactory
或 PlatformTransactionManager
Bean。它们将为您自动配置。
是的,在您的 class 或方法上添加 Transactional
注释就足以进行交易。自动提交甚至应该自动关闭(出于优化目的),以防未在 DataSource
级别完成。
对于"programmatical"部分,您应该考虑留在注释方面。您可以使用 事务传播 策略来隔离某些操作。
关于使用声明式注解方法的几个重要注意事项。
记得注释 public
方法,如果可能的话。任何其他方法的可见性都无法通过 Java 代理或 CGLIB 代理进行管理,因此,即使您不会注意到它,这些方法也不会参与事务上下文。对于 protected
或 private
方法,您必须使用 AspectJ。
另请记住,在使用代理时,自我调用(并期待新交易)不起作用。
要使用程序化方法,您只需要 Autowire
TransactionTemplate
或 PlatformTransactionManager
Bean。
PlatformTransactionManager
允许对交易进行更多自定义,而 TransactionTemplate
更像是一个实用对象(但是可以根据需要建模)。
显然,不要在同一个方法调用堆栈中混合使用这两种方法。
我对@Transactional 注释有很多困惑。
1) 如果我只使用声明性方法,是否足以将我的服务 class/methods 标记为 @Transactional,或者我是否应该创建配置 bean 和属性,如此 Baeldung article 所示?
2) 在某些情况下,我什至需要使用编程方法,以便能够在我的工作流的特定点显式调用 flush()。在这种情况下,以前的休眠配置定义是强制性的吗?
如果您在 Spring 引导项目上,不,您不需要显式声明 SessionFactory
或 PlatformTransactionManager
Bean。它们将为您自动配置。
是的,在您的 class 或方法上添加 Transactional
注释就足以进行交易。自动提交甚至应该自动关闭(出于优化目的),以防未在 DataSource
级别完成。
对于"programmatical"部分,您应该考虑留在注释方面。您可以使用 事务传播 策略来隔离某些操作。
关于使用声明式注解方法的几个重要注意事项。
记得注释 public
方法,如果可能的话。任何其他方法的可见性都无法通过 Java 代理或 CGLIB 代理进行管理,因此,即使您不会注意到它,这些方法也不会参与事务上下文。对于 protected
或 private
方法,您必须使用 AspectJ。
另请记住,在使用代理时,自我调用(并期待新交易)不起作用。
要使用程序化方法,您只需要 Autowire
TransactionTemplate
或 PlatformTransactionManager
Bean。
PlatformTransactionManager
允许对交易进行更多自定义,而 TransactionTemplate
更像是一个实用对象(但是可以根据需要建模)。
显然,不要在同一个方法调用堆栈中混合使用这两种方法。