Обработка транзакций в очереди redis

У меня есть несколько задач в функции, и я использую транзакцию в функции
Я хочу использовать очередь redis для этой транзакционной задачи
Например, у меня есть функция, как показано ниже :



 private function  check_destination_delivered($request,$id,$order)
{
    if ($request->get('status') == 'destination_delivered')
    {
      $this->destination_verification($request);
      DB::beginTransaction();
      try
      {
        $this->calculate_credit($id,$order);
        $this->calculate_customer_gift_credit($id,$order);
        DB::commit();
      }
      catch (Exception $e)
      {
        DB::rollback();
        return $this->respondUnprocessable(1180,'error', $e);
      }
    }
}

В этой функции я хочу эту строку

$this->destination_verification($request);

Запустить до начала транзакции и после этого эту строку :

    $this->calculate_credit($id,$order);
    $this->calculate_customer_gift_credit($id,$order);

Используйте очередь redis, чтобы вычислить несколько часов спустя и использовать транзакцию для каждой задачи, которая должна быть выполнена, и если некоторые задачи не будут выполнены .очередь выполняется снова, пока не будут выполнены все задачи

1 ответ

  1. Я исправляю это с помощью функции put в очереди, как показано ниже :

    class CreditJob extends Job implements ShouldQueue
    {
    use InteractsWithQueue, SerializesModels;
    
    protected $order;
    protected $trip;
    protected $promotion;
    protected $customer;
    
    public function __construct($order,Order $trip,Customer $customer, Promotion $promotion)
    {
      $this->order = $order;
      $this->trip = $trip;
      $this->promotion = $promotion;
      $this->customer = $customer;
    }
    
     public function handle()
    {
        $retry=0;
        $notDone=TRUE;
        DB::beginTransaction();
        while($notDone && $retry < 5)
        {
          try
          {
              $this->calculate_promotion($this->order);
              $this->calculate_credit($this->order);
              DB::commit();
              $notDone=FALSE;
          }
          catch (\Exception $e)
          {
              DB::rollback();
              $retry++;
              sleep(30);
          }
        }
        if($retry == 5)
        {
            $this->trip->fail_calculate_credit_and_promotion($this->order);
        }
    } 
    
     }
    

    Если все задачи не выполнены .в цикле очереди выполняется снова
    Это правильно?