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