Guest User

Untitled

a guest
Dec 5th, 2023
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.25 KB | None | 0 0
  1. Из модели User.php:
  2.   public function updateBalance($cash): void
  3.   {
  4.     $this->balance = $cash;
  5.     logger('Запрос отправлен, баланс: ' . $cash);
  6.     $this->save();
  7.     logger('Запрос сохранён, баланс: ' . $this->balance);
  8.   }
  9.  
  10. Из Controller.php:
  11.   public function buy_bet_withdraw(Request $request) {
  12.     $bet_amount = $request->get('bet');
  13.     $user = $request->user();
  14.     $bet_index = 1;
  15.  
  16.     try {
  17.       $lockKey = 'lox_test_lock_' . $user->user_id;
  18.  
  19.       if ($this->redis->setnx($lockKey, 1)) {
  20.         DB::transaction(function () use ($user, $bet_index, $bet_amount, $lockKey) {
  21.           $demo_balance = $user->demo_balance;
  22.  
  23.           BuyLogs::insert([
  24.             'user_id' => $user->user_id,
  25.             'price' => floatval($bet_amount),
  26.           ]);
  27.  
  28.           $this->redis->publish('buy', json_encode([
  29.             'type' => 'cash',
  30.             'price' => 0
  31.           ]));
  32.  
  33.           $old_price = $user->balance;
  34.           $price = $user->balance - $bet_amount;
  35.           $user->updateBalance($price);
  36.  
  37.           logger('Баланс пользователя: ' . $old_price . ', стал: ' . $price . ' | Слот: ' . $bet_index);
  38.         });
  39.  
  40.         $this->redis->del($lockKey);
  41.         return response()->json([
  42.           'balance' => $user->balance,
  43.         ]);
  44.       } else {
  45.         return response()->json(['success' => false, 'message' => 'Ошибка при обработке. Попробуйте позже.'], 400);
  46.       }
  47.     }
  48.     catch (\Throwable $error) {
  49.       \Log::error('Error: ' . $error->getMessage());
  50.       $this->redis->del($lockKey);
  51.       return response()->json(['success' => false, 'message' => 'Неизвестная ошибка'], 400);
  52.     }
  53.   }
  54.  
  55.  
  56. Выполняю запрос:
  57. const { data } = await axios.post('/api/buy', params);
  58.  
  59. Он находится в функции, которая выполняется два раза одновременно, тем самым отправляя два /api/buy, в первый раз баланс изменяется, но уже во второй он не меняется, но при этом возвращая успех об изменении баланса :(
  60.  
  61. Судя по логам:
  62. [2023-12-06 05:57:54] local.DEBUG: Запрос отправлен, баланс: 1427.1  
  63. [2023-12-06 05:57:54] local.DEBUG: Запрос отправлен, баланс: 1427.1  
  64. [2023-12-06 05:57:54] local.DEBUG: Запрос сохранён, баланс: 1427.1  
  65. [2023-12-06 05:57:54] local.DEBUG: Баланс пользователя: 1437.10, стал: 1427.1 | Слот: 0  
  66. [2023-12-06 05:57:54] local.DEBUG: Запрос сохранён, баланс: 1427.1  
  67. [2023-12-06 05:57:54] local.DEBUG: Баланс пользователя: 1437.10, стал: 1427.1 | Слот: 1
  68.  
  69. Но если логически, то правильная последовательно будет такой: (но это мне не светит)
  70. [2023-12-06 05:57:54] local.DEBUG: Запрос отправлен, баланс: 1427.1  
  71. [2023-12-06 05:57:54] local.DEBUG: Запрос сохранён, баланс: 1427.1  
  72. [2023-12-06 05:57:54] local.DEBUG: Баланс пользователя: 1437.10, стал: 1427.1 | Слот: 0  
  73. [2023-12-06 05:57:54] local.DEBUG: Запрос отправлен, баланс: 1427.1  
  74. [2023-12-06 05:57:54] local.DEBUG: Запрос сохранён, баланс: 1427.1  
  75. [2023-12-06 05:57:54] local.DEBUG: Баланс пользователя: 1437.10, стал: 1427.1 | Слот: 1  
  76.  
  77. А так же видно, что в одной секунде как раз обрабатывается запрос, хотелось бы как-то иметь последовательность, я использовал её от Laravel Queue, но без результатно :(
  78.  
  79. Использовать блокировщик от Redis не вариант, поскольку он блокирует запрос, но это мне не нужно, использовал для ознакомления, дабы как-то найти решение проблемы.
  80.  
  81. Вот так вот, надеюсь каждый понял про мою проблему :(
Add Comment
Please, Sign In to add comment