假设我有一个SQL事务性财务系统,但在事务期间它调用外部非SQL服务。
如何处理,例如如果外部呼叫成功与否,我们没有电力损失?
让我们想象一下,在SQL数据库和比特币钱包上进行交易。
第3步和第4步之间的断电,将阻止提交交易(用户现金没有减少),但实际上是从钱包发送我们的钱。
第二个场景是在调用外部服务之前删除用户现金并提交。但是,当外部服务失败(非实际发送)资金后发生断电时,我们不会在外部服务失败后退回用户资金(假设比特币钱包已关闭)。
目前,我正在扣钱并将交易标记为"正在进行中" (并提交)在调用外部服务之前,如果外部服务响应正常,我将所有内容标记为已成功完成。
但是,在断电时,我仍然可以保持在断电后某些交易被标记为"正在进行",货币减少的情况,但我必须看看比特币钱包/区块链交易如果钱实际上是被发现了。
在这种情况下,有更好的方法来管理交易吗?如果我们的外部呼叫成功与否,是否有可能以任何方式解决未来时间的问题? (就像我可以检查区块链中所有过去的交易一样)
答案 0 :(得分:1)
欢迎来到分布式交易的精彩世界!在各个地方(MS,Google等)工作了很多年后,Pat Helland得出的结论是没有银弹并且你能做的最好就是去# 39;最终的一致性'。
您正在使用“正在进行的”#39;旗。在不知道远程交易的细节的情况下(即您需要完成哪些步骤,在完成每项步骤时可获得哪些数据),我无法告诉您如何完成此操作,以及一些常规性。
如果您可以在提交事务之前从远程站点获取事务ID,那么当您使用此事务ID时,它会更新您的本地数据库。远程交易完成后,更新“完成”状态。在本地数据库上标记。
您现在将拥有许多可能的状态。只有两个需要注意:
这是一个大纲。正如我所说,我不知道比特币交易如何完成的细节,但我希望它能给你一个想法。