Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在第三方API和我自己的数据库之间保持一致性?_C#_.net_Api_Rest_Transactions - Fatal编程技术网

C# 如何在第三方API和我自己的数据库之间保持一致性?

C# 如何在第三方API和我自己的数据库之间保持一致性?,c#,.net,api,rest,transactions,C#,.net,Api,Rest,Transactions,我正在使用REST API,处理付款请求的场景如下: 客户端将请求(付款信息)发送到我自己的API 我的API调用第三方REST API,向其传递支付信息,并从中接收支付ID。如果第三方API调用因任何原因失败,则会立即将错误返回给客户端 我的API将步骤2中生成的付款ID和一些额外信息存储到自己的数据库中 我希望数据在第三方API和我自己的数据库之间保持一致。但是,如果由于某种原因,在步骤3中无法访问数据库,我将得到不一致的数据-付款将存在于第三方API中,但不存在于我自己的API数据库中 处

我正在使用REST API,处理付款请求的场景如下:

  • 客户端将请求(付款信息)发送到我自己的API
  • 我的API调用第三方REST API,向其传递支付信息,并从中接收支付ID。如果第三方API调用因任何原因失败,则会立即将错误返回给客户端
  • 我的API将步骤2中生成的付款ID和一些额外信息存储到自己的数据库中
  • 我希望数据在第三方API和我自己的数据库之间保持一致。但是,如果由于某种原因,在步骤3中无法访问数据库,我将得到不一致的数据-付款将存在于第三方API中,但不存在于我自己的API数据库中


    处理此一致性问题的最佳方法是什么?

    @Gusman讨论了如果第3步无法完成,如何允许第2步


    允许您在同一交易中执行步骤2和步骤3,即,如果步骤3无法完成,则取消步骤2。

    有多种机制可以执行此操作:将交易数据存储到磁盘,当数据库可用时,插入数据,在第三方取消付款,将其保留在内存中,直到数据库启动,等等,所以基本上这是一个基于观点的问题。。。仅供参考,如果数据库可用,我会将数据存储在磁盘缓存中,并检查每个X间隔,然后插入所有缺失的数据。@Gusman我不同意这是一个微不足道的问题(存在多种机制等)的观点。如果写入磁盘和MSSQL数据库,仍然需要MSDTC来协调事务。然而,写入磁盘也可能失败。如果存储在内存中,则在REST调用完成后,进程可能会失败。我没有说这很简单,如果需要0故障容忍度,则该任务可能非常复杂,我的意思是有多种方法可以实现结果,因此它是基于意见的,不确定是否不清楚:)。
    TransactionScope
    无法自动回滚步骤2。第2步是一个出局或过程调用。@Davin您有任何意见参考吗?据我所知,TransactionScope是为分布式事务设计的,因此步骤2仅在
    scope.Complete()
    上提交。例如,请参见,HTTP是无状态的。除非您编写特定的MSDTC代码,否则rest调用不会自动回滚。即使这样,第三方也必须提供一种回滚机制,因为您无法控制该代码。您能否解释一下
    步骤2是如何取消的
    ?归结起来就是,“OP的第三方API支持MSDTC吗?”我想是这样的。