Как сделать многопользовательский процесс, используя Laravel? - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь выполнить многопользовательский процесс, в настоящее время он работает отлично, у меня сейчас проблема в том, что мне нужно выполнить многопользовательский процесс ...

У меня есть система онлайн-счетов который предлагает доступный номер счета, проблема в том, что если два или более пользователя входят одновременно, как я могу убедиться, что сохраняются разные номера счетов?

В моей модели модели Cotizacion.php

class Cotizacion extends Model
{
    protected $table = 'cotizaciones';
    public $primaryKey = 'id';

    public static function rules($cotizacion){
        $est=Cotizacion::where('n_cotiz',$cotizacion)->first();
        return $est;
    }
}

В моем контроллере:

public function savecoti(Request $request){
    $posinum="00001$numerocotitiaguardar";
    $p=1;

    do{     
        $regla=Cotizacion::rules($posinum);
        if($regla){
            $limpiarproximo=ltrim($numerocotitiaguardar,"0");
            $limpiarproximo = $limpiarproximo +1;
            $valorproximo = str_pad($limpiarproximo, 8, "0", STR_PAD_LEFT);
            $posinum="00001$valorproximo";
            $esta=1;
        }else{
            $esta=0;
            $limpiarproximo=ltrim($valorproximo,"0");
            $valorproximo = str_pad($limpiarproximo, 8, "0", STR_PAD_LEFT);
            $numerocotities ="$sucursaltalonario$numerocotitiaguardar";
            $buscarencryp = new VProximo($valorproximo);  
            $encriptacion=  $buscarencryp->vervalor();
            $proximonumero = implode($encriptacion);
            $cotizacionsave->n_cotiz        = $numerocotities;
        }  
    }while ($esta==1);

    $cotizacionsave->save();
    $idcoti = $cotizacionsave->id;
}

Как я уже сказал, он работает хорошо, но у меня проблема, если есть несколько пользователей одновременно, что мне нужно делать или изучать, чтобы гарантировать что я не сохраняю тот же номер?

1 Ответ

0 голосов
/ 12 июля 2020

Обычно это то, что вы оставляете в базе данных. Есть несколько возможных подходов. Например, упомянутое выше автоматическое увеличение базы данных. Это гарантированный уникальный идентификатор. Если вы хотите использовать для этого специальный столбец c, вы должны добавить уникальное ограничение в столбец.

Во-вторых, чтобы все прошло хорошо (избегайте состояния гонки), вы должны использовать транзакцию базы данных, которая может легко сделать от Laravel. См. https://laravel.com/docs/7.x/database#database -операции в транзакциях. И https://en.m.wikipedia.org/wiki/Time-of-check_to_time-of-use, если вас интересуют подробности TOCTOU.

Небольшой совет, если бы ваш код был на английском sh, вы бы привлекли больше помощников и избежали голосов против. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...