如何在交易过程中处理无交易服务?

时间:2014-06-18 12:08:31

标签: sql transactions finance bitcoin distributed-transactions

假设我有一个SQL事务性财务系统,但在事务期间它调用外部非SQL服务。

如何处理,例如如果外部呼叫成功与否,我们没有电力损失?

让我们想象一下,在SQL数据库和比特币钱包上进行交易。

  1. 启动SQL事务
  2. 扣除用户金额现金
  3. 通过比特币钱包发送用户现金
  4. 提交
  5. 第3步和第4步之间的断电,将阻止提交交易(用户现金没有减少),但实际上是从钱包发送我们的钱。

    第二个场景是在调用外部服务之前删除用户现金并提交。但是,当外部服务失败(非实际发送)资金后发生断电时,我们不会在外部服务失败后退回用户资金(假设比特币钱包已关闭)。

    目前,我正在扣钱并将交易标记为"正在进行中" (并提交)在调用外部服务之前,如果外部服务响应正常,我将所有内容标记为已成功完成。

    但是,在断电时,我仍然可以保持在断电后某些交易被标记为"正在进行",货币减少的情况,但我必须看看比特币钱包/区块链交易如果钱实际上是被发现了。

    在这种情况下,有更好的方法来管理交易吗?如果我们的外部呼叫成功与否,是否有可能以任何方式解决未来时间的问题? (就像我可以检查区块链中所有过去的交易一样)

1 个答案:

答案 0 :(得分:1)

欢迎来到分布式交易的精彩世界!在各个地方(MS,Google等)工作了很多年后,Pat Helland得出的结论是没有银弹并且你能做的最好就是去# 39;最终的一致性'。

您正在使用“正在进行的”#39;旗。在不知道远程交易的细节的情况下(即您需要完成哪些步骤,在完成每项步骤时可获得哪些数据),我无法告诉您如何完成此操作,以及一些常规性。

如果您可以在提交事务之前从远程站点获取事务ID,那么当您使用此事务ID时,它会更新您的本地数据库。远程交易完成后,更新“完成”状态。在本地数据库上标记。

您现在将拥有许多可能的状态。只有两个需要注意:

  1. InProgress设置,未完成,没有TransactionId:remnote事务 需要启动和完成
  2. InProgress设置,未完成,交易ID存在:可能是 在远程站点提交;联系它检查是否 交易已完成;如果没有完成(或回到第一个 陈述并完成整个事情)
  3. 这是一个大纲。正如我所说,我不知道比特币交易如何完成的细节,但我希望它能给你一个想法。