forum icon indicating copy to clipboard operation
forum copied to clipboard

Inserções duplicadas no banco de dados quando recebo múltiplas requisições de uma API - LARAVEL

Open gabrieldesousah opened this issue 6 years ago • 3 comments

Olá, tudo bem? Estou brincando com o desenvolvimento de um sisteminha que recebe mensagens de um chat via API e em seguida eu trato as mensagens e categorizo pelo número do contato. O problema é q as vezes a api trava e manda ao mesmo tempo várias requisições do mesmo contato e a minha busca no banco de dados para saber se esse contato já existe falha, e ele é duplicado. Eu preciso de uma forma de evitar essas explicações e não pode ser á partir de uma chave composta no MySQL.

Abaixo, um trecho do código:

$contact = Contact::where( [ ['phone', '=', $msg->contact_uid], ['customer_id', '=', $channel->customer_id], ] )->get();

    //Ações quando é um novo contato
    if( $contact == null or $contact == "" or empty($contact))
    {
        $contact = new Contact;
        $contact->name = $msg->contact_name;
        $contact->customer_id = $channel->customer_id;
        $contact->phone = $msg->contact_uid;
        $contact->save();

}

gabrieldesousah avatar Apr 24 '18 02:04 gabrieldesousah

Você pode tentar usar lock table para garantir que apenas um processo consegue inserir na tabela por vez.

deleugpn avatar Apr 24 '18 03:04 deleugpn

hmm e isso é feito no lado do banco de dados ou do laravel? E se eu tiver uma quantidade gigantesca de interações, isso diminui a performance?

Além do mais, um insert vai aguardar o outro mas o select já foi feito, então dará problemas, não?

gabrieldesousah avatar Apr 24 '18 11:04 gabrieldesousah

Veja: https://laravel.com/docs/master/queries#pessimistic-locking

lockForUpdate vai bloquear o acesso para outras consultas que também utilizarem lockForUpdate.

Sim, vai impactar na performance https://www.postgresql.org/docs/10/static/explicit-locking.html#LOCKING-ROWS

ibrunotome avatar Apr 24 '18 19:04 ibrunotome