我正在从事Spring Boot,需要澄清有关transaction
管理的一些信息。
例如,我确实有两个运行两个单独作业的类(第一个作业是在数据库上创建配置文件,第二个作业是在其他系统上调用Restful应用程序也创建配置文件)。
这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
}
}