gpt4 book ai didi

php - InnoDB 事务和 REST

转载 作者:行者123 更新时间:2023-11-29 08:38:52 25 4
gpt4 key购买 nike

我希望我的问题适合这个网站并且不太广泛,但我在设计以下架构时遇到了困难:

我有两个网站。站点 1 负责在用户之间转移积分。站点 2 负责向这些用户提供服务/产品,这些服务/产品可以用他们在站点 1 中拥有的积分进行支付。

假设我在站点 1 上有 1000 个积分。我有一种服务/产品,在站点 2 上需要 50 个积分,并且用户想要用他在站点 1 中拥有的积分量来购买它。

两个站点都通过 REST 进行通信。例如,当用户想要购买服务/产品时,站点 2 准备其请求并将其发送到站点 1,站点 1 进行交易并向站点 2 确认交易已成功(例如,用户有足够的信用来购买服务/产品)并且这些积分已成功转移到目的地)

现在这是棘手的部分。在站点 1 中,我有以下逻辑:

Begin transaction
update user set credits -= 50 where id = 1
update user set credits += 50 where id = 2
REST CALL (Site 2) Success
Site 2 response - OK, commit transaction
Commit

由于 REST 是对不同站点的调用,因此事务可能需要一些时间才能完成。同时,整个表是否针对任何事务被锁定,或者用户 1 和用户 2 的行是否被锁定?这是实现我的逻辑的正确方法吗?我错过了什么吗?

提前谢谢您。

最佳答案

这是对您对凯西回答的问题的回应:

是的,只要你这样做:

  • 站点 2:

    1. 客户登录。
    2. 向站点 1 询问该用户(用户 1)的信用总额和交易历史记录(GET 请求)。
    3. (任何收到“交易成功”响应的等待交易都可供下载/分发)
    4. 使用信用总额来启用“购买”按钮来购买可以买得起的东西。
    5. 客户点击“购买”按钮
    6. 生成站点 2 独有的交易 ID,与谁购买了什么、何时购买的详细信息一起存储在数据库中,状态 = 待处理。告诉用户交易已收到,并且应该尽快通知他们交易是否成功(HTTP 202 响应)
    7. 将购买请求发布到站点 1,包括身份验证(不希望伪造请求导致人们花费他们不想花的钱)和交易 ID。
  • 站点 1

    1. 验证身份验证
    2. 验证站点 2 的 transactionID 之前是否未被站点 2 使用过。如果有,则返回错误,如果没有:
    3. 开始交易
    4. 更新用户设置积分 -= 50,其中 id = 1
    5. 更新用户设置积分 += 50,其中 id = 2
    6. 插入事务remoteSiteID = 'Site2',remoteTransactionID = tID,user = 1
      如果 site2 是唯一使用 site1 积分的网站,则不需要 remoteSiteID 字段
    7. 提交
    8. 休息调用(站点 2)成功
  • 站点 2:

要么:
1. 接收 REST 成功调用,使购买可供下载/发送,向用户显示一些消息,表明购买处理已完成。更新本地交易记录,state=succeeded。

或者
2. 站点 2 已关闭。下次后台轮询流程运行(检查等待响应的购买请求的状态)或下次客户登录时(在这种情况下也会启动轮询 - 第一个列表中的步骤 3),将记录交易成功

如果您尚未收到事务响应,请使用事务 ID 执行 GET。如果响应错误,则站点 1 没有收到原始请求,站点 2 可以随意重复事务 (POST) 请求。如果响应是“交易失败”,则说明用户没有足够的积分,相应地更新站点 2 上的交易记录。如果结果是“交易成功”,也记录下来。

如果交易失败 N 次,或者自用户单击按钮以来已经过了一定时间(例如 5 分钟),则站点 2 将停止重试购买。

关于php - InnoDB 事务和 REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14419786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com