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