Bloqueio otimista ou pessimista: qual deve usar uma reserva ou checkout?
Share

In this article
Use bloqueio pessimista quando muitos usuários competem pela mesma linha, como os últimos ingressos de um evento. Use bloqueio otimista, com um campo de versão, quando a contenção é rara, como reservas ou carrinhos distribuídos por vários horários e produtos. Escolha com base na frequência com que dois escritores realmente acessam a mesma linha.
Qual é a diferença entre bloqueio otimista e pessimista?
O bloqueio pessimista bloqueia outros escritores enquanto uma transação mantém uma linha, fazendo com que os conflitos esperem. O bloqueio otimista permite que todos prossigam, mas rejeita uma escrita se o campo de versão mudou por baixo, fazendo com que os conflitos sejam reexecutados. O primeiro troca latência por certeza; o segundo troca tentativas ocasionais por ausência de espera.
Quando o bloqueio otimista é a melhor escolha?
O bloqueio otimista é vantajoso quando as escritas são curtas e colisões são raras. Nos horários de reserva da Trexind, um campo de versão significa que a escrita que perde a corrida gera um conflito, não uma sobrescrição silenciosa, e tenta novamente contra o estado atual do horário. Manter um bloqueio durante toda a requisição custaria mais do que economizaria.
Quando o bloqueio pessimista é a melhor escolha?
O bloqueio pessimista é melhor para uma única linha muito disputada por muitos compradores ao mesmo tempo, como os últimos ingressos de um evento popular. Nesse caso, as tentativas repetidas do bloqueio otimista causam sobrecarga e forçam cada perdedor a refazer todo o checkout. Um bloqueio curto permite que o segundo comprador espere alguns milissegundos e veja que está esgotado.
Como decidir para o seu próprio sistema?
Pergunte com que frequência dois escritores acessam a mesma linha e qual o custo para o usuário de perder a corrida. Colisões raras e tentativas baratas indicam bloqueio otimista. Colisões frequentes em uma linha, ou tentativas que refazem trabalho caro, indicam bloqueio pessimista. Meça a contenção antes de decidir; o mesmo aplicativo pode usar ambos.
Muitas linhas, poucas colisões por linha: otimista (estoque em centenas de SKUs)
Uma linha, muitos escritores simultâneos: pessimista (últimos ingressos de um evento)
Escrita ocorre uma vez por entidade: um bloqueio curto é adequado (envio de prova)
Resumo
Últimos ingressos de um evento (FindYourVibe) · Alta: pico em uma linha · Bloqueio pessimista na linha · O perdedor espera milissegundos em vez de refazer todo o checkout
Horários de consultas e mesas (Trexind) · Baixa: escritas curtas, raramente contestadas · Campo de versão otimista · Um bloqueio durante toda a requisição não compensa a latência
Estoque em muitos SKUs (Skyxis) · Baixa: carrinhos raramente acessam a mesma linha · Campo de versão otimista · Um bloqueio durante o período do checkout custa mais que a rara tentativa
Envio de tentativa de prova (PS Classes) · Único por tentativa · Bloqueio Redis no ID da tentativa · O envio ocorre uma vez, então alguns milissegundos de bloqueio são mais baratos que uma classificação corrompida
Publicado originalmente em sakshamjain.codes/blog/optimistic-vs-pessimistic-locking. Precisa disso implementado? Veja meus serviços em NexoRush ou envie uma mensagem.