Spring Hibernate @Transactional 说明

Spring Hibernate @Transactional clarifications

我对@Transactional 注释有很多困惑。

1) 如果我只使用声明性方法,是否足以将我的服务 class/methods 标记为 @Transactional,或者我是否应该创建配置 bean 和属性,如此 Baeldung article 所示?

2) 在某些情况下,我什至需要使用编程方法,以便能够在我的工作流的特定点显式调用 flush()。在这种情况下,以前的休眠配置定义是强制性的吗?

如果您在 Spring 引导项目上,不,您不需要显式声明 SessionFactoryPlatformTransactionManager Bean。它们将为您自动配置。

是的,在您的 class 或方法上添加 Transactional 注释就足以进行交易。自动提交甚至应该自动关闭(出于优化目的),以防未在 DataSource 级别完成。

对于"programmatical"部分,您应该考虑留在注释方面。您可以使用 事务传播 策略来隔离某些操作。


关于使用声明式注解方法的几个重要注意事项。

记得注释 public 方法,如果可能的话。任何其他方法的可见性都无法通过 Java 代理或 CGLIB 代理进行管理,因此,即使您不会注意到它,这些方法也不会参与事务上下文。对于 protectedprivate 方法,您必须使用 AspectJ。

另请记住,在使用代理时,自我调用(并期待新交易)不起作用。


要使用程序化方法,您只需要 Autowire TransactionTemplatePlatformTransactionManager Bean。

PlatformTransactionManager 允许对交易进行更多自定义,而 TransactionTemplate 更像是一个实用对象(但是可以根据需要建模)。

显然,不要在同一个方法调用堆栈中混合使用这两种方法。