From ba440e4a32d09b512e7678282465d88beb2df819 Mon Sep 17 00:00:00 2001 From: asahi Date: Sat, 13 Apr 2024 18:55:52 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E8=AF=BBatomikos=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 分布式事务/atomikos/atomikos.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/分布式事务/atomikos/atomikos.md b/分布式事务/atomikos/atomikos.md index 2eca699..598ce01 100644 --- a/分布式事务/atomikos/atomikos.md +++ b/分布式事务/atomikos/atomikos.md @@ -143,3 +143,14 @@ spring: properties: max-timeout: 900000 ``` +## atomikos分布式事务对微服务的支持 +在使用分布式事务时,传统单实例的ACID事务会被分割为多个本地事务,每个微服务都有自己的本地事务。这将会导致如下不一致的情况: +1. 如果出现了网络超时的情形,如果微服务1调用微服务2,并且在调用返回时发生超时,那么微服务1服务知晓微服务2的本地事务是提交还是失败回滚,此时全局的系统状态将是未定义的 +2. 如果微服务1在调用微服务2时,出现了重试,那么微服务2必须提供幂等的实现,该实现很困难并且容易出错 +3. 在微服务1调用微服务2时,即使调用发生失败,也不能做除了重试外的其他尝试,因为微服务2的本地事务可能已经提交,只是因为网络超时而导致微服务1调用失败。 + +> 因为微服务1和微服务2都拥有自己的本地事务,在微服务1调用微服务2超时是,微服务2可能其本地事务已经提交,只是因为网络问题导致微服务1调用失败。此时,微服务1除了重新调用微服务2直到调用成功,并且微服务2保证多次调用幂等外,无法采用其他方式来进行处理 + +对此,atomikos提供了一个全局事务,在全局事务内,无序额外进行编码即可保证全局系统状态的一致性。当微服务1调用微服务2失败时,全局事务会保证微服务2的本地事务操作被回滚,此时微服务1可以尝试其他对失败调用的补偿方式(在同一全局事务内尝试)。 + +