Spring @Transactional边界

11

我在我的服务层中使用了 @Transactional。如果我在两个更新服务方法上注释 @Transactional(使用默认设置),并且控制器方法调用这两个方法来执行其操作,那么这两个服务方法使用同一个事务吗?

看起来它们并不是,我正在寻找确认。在我看来,要让这两个方法使用同一个事务,我需要编写一个第三个服务方法,在其中注释 @Transactional,然后从那里调用原始的两个方法。

2个回答

13

你说的一切都是正确的,包括如何绕过这个问题。现在可能是实施一个门面服务来协调所有其他服务的好时机。这样,使用的服务将参与门面服务的事务。


2
同意,但这并不是一个缺陷,所以我不会称其为“问题”。有时你想调用两个服务方法,每个方法都在自己的事务中运行。例如,假设一个服务调用完成购买,第二个服务基于用户看到的广告决定在用户浏览器窗口边缘显示哪个广告。如果广告逻辑失败,您不希望回滚购买;您希望显示一个购买完成的屏幕,并提供备用广告。 - gatkin
@gatkin 当然。我所说的“issue”是指“原帖作者正在努力解决的问题”。 - hvgotcodes
感谢您的澄清。在我的情况下,我有一个网页收集一个人的大量信息(姓名、地址、电话号码等)。控制器正在调用各种服务方法来处理所有的持久化。看起来我需要将控制器正在做的封装到一个单一的@Transactional服务方法中,并从控制器中简单地调用该方法,传入所有相关数据。 - GriffeyDog

0

在我看来,那听起来是正确的。但你也应该考虑这两种方法是否应该有事务传播的默认设置。请参见此处并决定它应该是'REQUIRED'还是'SUPPORTS'?例如:@Transactional(propagation = Propagation.REQUIRED)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接