forum
forum copied to clipboard
Inserções duplicadas no banco de dados quando recebo múltiplas requisições de uma API - LARAVEL
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();
}
Você pode tentar usar lock table para garantir que apenas um processo consegue inserir na tabela por vez.
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?
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