我在microservices下工作,使用@transactional,遇到了一个疑问:假设我在服务类上编写了@transactional,它在内部为数据库操作调用不同的microservices。现在假设其中一个微服务失败了,其他微服务的数据库状态会发生什么变化,因为它们已经提交了自己的数据库,或者回滚将如何发生?
示例代码如下
@Transactional
@Service
class MySerivce{
public void method(){
// call microservice1
// call microservice 2 (fails or give error)
}
}
请分享知识。谢谢!
1条答案
按热度按时间h79rfbju1#
这两个微服务和您的应用程序是独立的系统。
@Transactional
仅管理应用程序的本地事务。它不知道如何管理它调用的其他微服务的事务(也不可能做到这一点,否则你会像黑客一样攻击其他微服务……)因此,如果microservice2失败,那么回滚已经在microservice1上完成的所有操作将无济于事。你必须手动处理。microservice1需要提供api来撤销这样的操作,然后您需要手动捕获microservice1抛出的异常并调用这个api来应用补偿操作。
一种称为saga模式的模式就是为了解决这个问题。你可以在谷歌上搜索更多信息。