Temos um sistema que recebe eventos de clientes e os armazena em um banco de dados.
Cada evento é salvo como um atomic INSERT
e possui uma id_event
chave primária auto-incrementada.
Nossos clientes podem executar uma ação específica que faz com que 2 eventos sejam disparados em rápida sucessão:
- 1)
name: 'board-added', boardId: 12344
- 2)
name: 'board-switched', boardId: 12344
Ambos os eventos chegam ao nosso servidor na ordem correta.
No entanto, por algum motivo, continuamos encontrando alguns board-switched
eventos com um id_event
que precede seu board-added
evento correspondente.
Como você pode ver no conjunto de resultados abaixo, board-added
tem um valor maior id_event
que o board-switched
que está errado.
{name: "board-switched", boardId: 313994, id_event: 48041136}
{name: "board-added", boardId: 313994, id_event: 48041137}
Minha pergunta é:
É possível que 2 INSERT
eventos, executados sequencialmente, façam com que o 2º INSERT
seja concluído antes do 1º INSERT
?
Não é garantido se forem solicitações separadas que não estejam na mesma transação do banco de dados. Dada a arquitetura dos aplicativos da Web modernos, se forem solicitações separadas, quase posso garantir que não estejam na mesma transação e, portanto, não sejam dependentes umas das outras.
Um aplicativo de pool de conexões provavelmente aceitará as duas solicitações com encadeamentos diferentes, portanto, mesmo que as solicitações sejam emitidas pelo cliente em ordem, a segunda solicitação poderá
insert
entrar no banco de dados antes da primeira se a execução da primeira for mais lenta.