同时请求的同一用户会话出现问题

时间:2017-03-26 13:46:05

标签: php mysql yii

我被指派维护通过网络应用程序销售游戏物品代码的项目,并通过短信将代码传递给客户的手机。有一个问题,我仍然不知道如何解决它。

仅在用户购买产品时发生。他们只是点击一次购买,但应用程序似乎多次处理购买阶段。因此,用户只需支付一件商品即可获得大量商品。

通常,用户必须将vi信用卡的资金添加到他们的帐户中才能获得足够的余额来购买产品。所以,这个阶段是有条件的。这是简要代码

<?php
    public function actionPurchase() {
        $user = Users::findOne(['mobile' => Yii::$app->session->get('mobile')]);

        $product_price = Yii::$app->session->get('product_price');

        $product_code = ProductStock::getCodefromPrice($product_price);

        // Save the transaction log
        $transaction = new Transactions();
        $transaction->product_code = $product_code;
        $transaction->amount = $product_price;
        $transaction->user_id = $user->id;
        $transaction->credit_before = $user->balance;
        $transaction->created = date('Y-m-d H:i:s');
        $transaction->save();

        if ($user->balance >= $product_price) {

            // Redeem the product from the API
            $raw = ProductStock::redeem($product_code);

            // Decode the JSON response
            $response = json_decode($resp);
            if ($response->status == 'Success') {

                // Adjust the user balance
                $new_credit = $user->balance - $product_price;
                $user->balance = $new_credit;
                $user->update();

                // Send the SMS
                Utilities::sendSMS($user->mobile, $response->item_pin);

                return $this->redirect(['success']);
            }
        }
    }
?>

正如您所看到的那样,我还会在购买之前和之后使用用户信用记录交易。所以如果购买成功。我减少了用户表中的用户余额,并记录了被记录后的信用额度。

请注意,用户与当前余额一起存储在MySQL表中。所以,这是表格的样子

| id |    mobile     | balance |       created        |
|  1 |   0811234567  |   300   |  2017-01-01 00:00:00 |

交易表看起来像这样

|   id   | user_id  |  product_code | amount |  credit_before  |  credit_after  |        created         |
| 119687 |    1     |    estr1203   |  100   |       300       |    200         |   2017-01-01 13:15:02  |

因此,如果用户成功购买产品,他们将在最后扣除余额。

但这是我目前遇到的问题的结果

|   id   | user_id  |  product_code | amount |  credit_before  |  credit_after  |        created         |
| 119691 |    1     |    estr1203   |  100   |       200       |    100         |   2017-01-01 13:15:03  |
| 119690 |    1     |    estr1203   |  100   |       200       |    100         |   2017-01-01 13:15:03  |
| 119689 |    1     |    estr1203   |  100   |       300       |    200         |   2017-01-01 13:15:02  |
| 119688 |    1     |    estr1203   |  100   |       300       |    200         |   2017-01-01 13:15:02  |
| 119687 |    1     |    estr1203   |  100   |       300       |    200         |   2017-01-01 13:15:02  |

请查看日志创建时间,它们是相同的。通常,如果用户点击多次购买产品,它也会多次处理该交易。因此,他们的余额应该按顺序扣除,如300到200,下一次是200到100,直到他们失去平衡,不再能够做到这一点。对于上面的示例,正​​确的交易记录应为

|   id   | user_id  |  product_code | amount |  credit_before  |  credit_after  |        created         |
| 119689 |    1     |    estr1203   |  100   |       100       |    0         |   2017-01-01 13:15:02  |
| 119688 |    1     |    estr1203   |  100   |       200       |    100         |   2017-01-01 13:15:02  |
| 119687 |    1     |    estr1203   |  100   |       300       |    200         |   2017-01-01 13:15:02  |

但是这看起来应用程序将这些同时请求视为同一个请求,因为它是同一个用户并且都访问if条件以检查用户是否同时具有足够的余额。因此,多个项目将发送给用户,他们只需点击购买一次。

任何人都可以给我如何处理这样一个问题的好主意?我现在还不知道如何解决这个问题,并且已经开始工作了几天。当应用程序调用API以便将项目代码发送给用户以及来自同一用户的同时请求时,这可能是一个问题。在从API成功返回产品之前,尚未扣除用户的余额。所以余额检查条件返回true。我不明白。因为当我测试它时,它可以正常工作。

提前谢谢。

0 个答案:

没有答案