【问题标题】:How to deal with no-transactional service during transaction?事务中无事务服务如何处理?
【发布时间】:2014-06-18 12:08:31
【问题描述】:

假设我有一个 SQL 交易金融系统,但在交易期间它调用外部非 SQL 服务。

如何处理如果外部调用成功与否,当我们没有电源时断电?

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

  1. 启动 SQL 事务
  2. 减少用户金额现金
  3. 通过比特币钱包向某处发送用户现金
  4. 提交

第 3 步和第 4 步之间的断电,将阻止提交交易(不会减少用户现金),但实际上是从钱包中发送我们的钱。

第二个场景是在调用外部服务之前减少用户现金和承诺。但是,当外部服务失败(没有实际发送)钱后会掉电时,我们不会让它在外部服务失败后归还用户资金(假设比特币钱包宕机)。

目前,在调用外部服务之前,我正在减少资金并将交易标记为“进行中”(并提交),然后如果外部服务响应正常,我将所有内容标记为成功完成。

但是,在断电时,我仍然可以处于断电后的某些交易被标记为“进行中”,资金减少的情况,但是如果实际发送了钱,我必须手动查看比特币钱包/区块链交易。

在这种情况下是否有更好的方法来管理事务?如果我们的外部调用成功与否,是否有可能以任何方式解决而无法在未来检查? (就像我可以检查区块链中所有过去的交易)

【问题讨论】:

    标签: sql transactions finance bitcoin distributed-transactions


    【解决方案1】:

    欢迎来到分布式事务的美妙世界!在不同地方(MS、Google 等)研究它们多年后,Pat Helland 得出结论,没有灵丹妙药,你能做的最好的事情就是选择“最终一致性”。

    您的“进行中”标志是一个良好的开端。在不知道远程事务的详细信息(即您必须经过哪些步骤,完成每个步骤时可获得哪些数据)的情况下,我无法准确地告诉您如何执行此操作,所以这里有一些一般性。

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

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

    1. InProgress 集,未完成,无 TransactionId:remnote 交易 需要开始和完成
    2. InProgress 设置,未完成,事务 ID 存在:可能是 在远程站点提交;联系它以检查是否 交易已完成;如果未完成(或返回第一个 陈述并完成整个事情)

    这是一个大纲。正如我所说,我不知道比特币交易是如何完成的,但我希望它能给你一个想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多