对于@Transactional注释,我有很多困惑。
1)如果我只使用声明式方法,是否就足够将我的服务类/方法标记为@Transactional,或者应该创建配置bean和属性,如此白龙文章所示?
2)在某些情况下,我需要使用甚至是编程的方法,以便能够在工作流的某个特定点显式地调用刷新()。在这种情况下,以前hibernate信任的定义是强制性的吗?
发布于 2019-02-16 22:07:20
如果您正在执行Spring项目,则不需要显式声明SessionFactory或PlatformTransactionManager Beans。他们会自动为你配置。
是的,将Transactional注释放在类或方法上就足够进行事务处理了。自动提交甚至应该自动关闭(为了优化目的),以防在DataSource级别上无法完成。
对于“程序”部分,您应该考虑保持在注释方面。您可以使用事务传播策略来隔离某些操作。
关于使用声明式注释方法的几个重要注意事项。
如果可能的话,请记住注释public方法。任何其他方法的可见性都不能通过Java代理或CGLIB代理来管理,因此,即使您没有注意到,这些方法也不会参与事务上下文。对于protected或private方法,您必须使用AspectJ。
还请记住,当使用代理时,自调用(&期待新事务)不起作用。
要使用编程方法,只需Autowire TransactionTemplate或PlatformTransactionManager Bean即可。
PlatformTransactionManager允许对事务进行更多的定制,而TransactionTemplate更像是实用对象(但是可以根据需要进行建模)。
显然,不要将这两种方法混合在相同的方法调用堆栈中。
https://stackoverflow.com/questions/54728039
复制相似问题