我正在进行春季启动工作,我需要澄清与transaction
管理层有关的事情。
例如,我有2个类可以运行两个单独的作业(第一个作业是在数据库上创建配置文件,第二个作业是调用restful应用程序,也可以在不同系统上调用配置文件)。
这两项工作必须是交易性的。两者都需要成功。如果其中一个作业失败,它不应该在任何数据存储上创建任何配置文件)
因为我在 Spring 中真的很新。我希望得到建议,并且需要知道这种情况的最佳实践。
答案 0 :(得分:2)
有一个facade pattern。我建议让facade service
加入两个服务的逻辑。服务必须是分开的,因为使用配置文件和与其他系统通信是业务逻辑的不同部分。
例如,ProfileService
和OuterService
可用于配置文件和外部通信。您可以编写SomeFacadeService
来连接两个方法并将其包装在一个事务中。 @Transactional
的默认传播为REQUIRED
。因此,将在方法SomeFacadeService.doComplexJob
上创建事务,方法profileService.createProfile
和outerService.doOuterJob
将加入当前事务。如果其中一个发生异常,则将回滚整个SomeFacadeService.doComplexJob
。
@Controller
public class SomeController {
@Autowired
SomeFacadeService someFacadeService ;
@RequestMapping("/someMapping")
public void doSomeJob() {
someFacadeService.doComplexJob();
}
}
@Service
public class SomeFacadeService {
@Autowired
ProfileService profileService;
@Autowired
OuterService outerService;
@Transactional
public void doComplexJob() {
profileService.createProfile();
outerService.doOuterJob();
}
}
@Service
public class ProfileService {
@Transactional
public void createProfile() {
// create profile logic
}
}