service中的方法可以互相调用吗?

在spring中service中的每个方法都是一个事务,如果serviceA调用serviceB中的方法,这样是不是会出现事务的嵌套?如果事务A嵌套事务B,事务B执行成功,事务A执行失败,事务B会回滚吗?

这个问题困扰了我好久……

4个回答

事务传播行为类型
说明

PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。

[color=red]PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。[/color]
可见事务是可以嵌套执行的,根据事务的一致性,应该A,B都执行成功以后才算完成,一个不成功,就回滚。

cshzyh
cshzyh 恩,我也刚知道事务传播属性,但是我在我们项目的代码里面没有找到事务传播属性的配置,只是在service上加了这个注解 @Transactional @Service
大约 5 年之前 回复





PROPAGATION_REQUIRED


Service层互相调用就证明你的代码结构设计严重不良。

cshzyh
cshzyh 如果我有一段业务逻辑的代码,在多个service中都会用到,难道每个service中都要复制一遍吗?
大约 5 年之前 回复

先说我的结论,事务B会回滚。
另外,我觉得写几行代码测一下应该不会很麻烦

cshzyh
cshzyh 事务传播属性设置不同,结果会不一样
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!