我正在使用Micronaut开发基本的CRUD API,其中一个服务(我们称之为#1)调用另一个服务(我们称之为#2),后者又调用CrudRepository的save方法。
为了定义原子工作单元,我使用了@Transactional注解。我应该将#1定义为@Transactional,还是将#2定义为@Transactional,还是将两者都定义为@Transactional?如果我使用@Transactional注解对两者都进行注解,Micronaut将如何处理它们?
到目前为止,我还没能破译注解是如何工作的。
2条答案
按热度按时间e37o9pze1#
如果#2可以独立调用,也可以被#1调用,那么两者都应该是
@Transactional
,其中propagation = Propagation.REQUIRED
。因此,如果直接调用#2,则创建事务,而如果调用#1,则为#1创建的事务用于#2。irtuqstp2#
为了定义原子工作单元,我使用了@Transactional注解。我应该将#1定义为@Transactional,还是将#2定义为@Transactional,还是将两者都定义为@Transactional?如果我使用@Transactional注解对两者都进行注解,Micronaut将如何处理它们?
不清楚#1中是否存在任何事务行为。如果答案是“是”,那么您的问题的答案也是“是”。如果#1中没有事务行为,那么用
@Transactional
标记它可能没有意义。如果您使用
@Transactional
标记#1,则默认情况下,当#1调用#2时,#2将参与与#1相同的事务。如果#2的传播级别被配置为REQUIRES_NEW
,则有可能使这两个事务在单独的事务中操作,但这听起来不像是您所希望的。