我试图推理保证同步数据源的系统/框架可以采取的故障恢复操作。我一直无法找到关于 Narayana 恢复机制的明确解释。
Q1:Narayana 是否本质上采用两阶段提交来确保跨 2 个数据源的分布式事务?
Q2:有人可以解释 Narayana 在这种情况下的行为吗?
- 应用程序想要将 X 保存到 2 个数据存储
- Narayana 的事务管理器 (TM) 生成事务 ID 并将信息写入磁盘
- TM 现在向两个数据存储发送一条准备消息
- 每个数据存储都以 prepare_success 响应
- TM 更新本地事务日志并向两个数据存储发送提交消息
- TM 失败(永久)。并且由于网络上的丢包,只有一个数据存储接收到提交消息。但其他数据存储接收并成功处理提交消息。
这两个数据存储现在彼此不同步(一个源具有另一个源中不存在的附加事务)。
启动新 TM 时,它无法访问旧的事务状态记录。因此,TM 无法在其中一个数据存储中启动丢失事务的恢复。
那么 2PC/Narayana/XA 如何声称他们保证分布式事务可以保持 2 个数据存储同步呢?从我的角度来看,他们只能以非常高的概率保持同步数据存储,但他们不能保证。
Q3:另一种情况,我不清楚应用程序/框架的行为。考虑以下交错事务(都在同一记录上 - 或至少具有部分重叠的记录集):
- Di = 数据源 i
- Ti = 事务 i
- Pi = 为事务 i 准备消息
D1接收P1;响应 P1_success
D2接收P2;响应 P2_success
D1接收P2;响应 P2_failure
D2接收P1;响应 P1_failure
网络数据包到达不同数据源的顺序可以决定哪个准备请求成功。这是否意味着有争议的记录在高交易速度下 - 所有交易都可能会继续失败(直到记录经历较低的交易请求率)?
有人可能会争辩说,我们选择的是一致性而不是可用性,但与 ACID 系统不同,不能保证至少有一个事务会成功(从而避免潜在的长期死锁)。