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