<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Freitas-Mp</title>
    <description>The latest articles on DEV Community by Freitas-Mp (@freitasmp).</description>
    <link>https://dev.to/freitasmp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F757753%2F8da32153-e936-4070-a5e4-c19123f3f769.jpeg</url>
      <title>DEV Community: Freitas-Mp</title>
      <link>https://dev.to/freitasmp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/freitasmp"/>
    <language>en</language>
    <item>
      <title>Race Condition Lock</title>
      <dc:creator>Freitas-Mp</dc:creator>
      <pubDate>Mon, 21 Sep 2026 22:39:53 +0000</pubDate>
      <link>https://dev.to/freitasmp/race-condition-lock-2lg5</link>
      <guid>https://dev.to/freitasmp/race-condition-lock-2lg5</guid>
      <description>&lt;p&gt;🧠 Consulta Guiada e Adaptativa&lt;/p&gt;

&lt;p&gt;Uma conversa entre Matondo Pedro e João&lt;/p&gt;

&lt;p&gt;Tema: Race Condition → Lock&lt;/p&gt;

&lt;p&gt;👨‍🏫 João:&lt;/p&gt;

&lt;p&gt;Vamos começar com um problema real.&lt;/p&gt;

&lt;p&gt;Imagina uma loja que tem apenas uma unidade de determinado produto.&lt;/p&gt;

&lt;p&gt;O João e a Maria entram na loja exatamente ao mesmo tempo e os dois tentam comprar esse produto.&lt;/p&gt;

&lt;p&gt;O que achas que pode acontecer?&lt;/p&gt;




&lt;p&gt;👨‍💻 Matondo Pedro:&lt;/p&gt;

&lt;p&gt;Os dois podem tentar comprar o mesmo produto e isso pode gerar um erro.&lt;/p&gt;




&lt;p&gt;👨‍🏫 João:&lt;/p&gt;

&lt;p&gt;Exatamente. Mas vamos olhar com mais cuidado.&lt;/p&gt;

&lt;p&gt;Imagina que o stock é:&lt;/p&gt;

&lt;p&gt;stock = 1&lt;/p&gt;

&lt;p&gt;O João consulta:&lt;/p&gt;

&lt;p&gt;stock &amp;gt; 0 → sim&lt;/p&gt;

&lt;p&gt;Ao mesmo tempo, a Maria também consulta:&lt;/p&gt;

&lt;p&gt;stock &amp;gt; 0 → sim&lt;/p&gt;

&lt;p&gt;Os dois recebem uma resposta válida.&lt;/p&gt;

&lt;p&gt;O que pode acontecer depois?&lt;/p&gt;




&lt;p&gt;👨‍💻 Matondo Pedro:&lt;/p&gt;

&lt;p&gt;Talvez a Maria fique com "-1"?&lt;/p&gt;




&lt;p&gt;👨‍🏫 João:&lt;/p&gt;

&lt;p&gt;Não necessariamente.&lt;/p&gt;

&lt;p&gt;O problema mais perigoso é que os dois podem confirmar a compra, mesmo existindo apenas uma unidade física do produto.&lt;/p&gt;

&lt;p&gt;Cada operação, isoladamente, parecia válida.&lt;/p&gt;

&lt;p&gt;O problema surgiu porque elas aconteceram ao mesmo tempo sobre o mesmo estado compartilhado.&lt;/p&gt;

&lt;p&gt;É uma Race Condition.&lt;/p&gt;




&lt;p&gt;👨‍💻 Matondo Pedro:&lt;/p&gt;

&lt;p&gt;É como se os dados fossem replicados para os dois utilizadores.&lt;/p&gt;




&lt;p&gt;👨‍🏫 João:&lt;/p&gt;

&lt;p&gt;A ideia está próxima, mas pensa de outra forma.&lt;/p&gt;

&lt;p&gt;Imagina uma sala com apenas uma porta.&lt;/p&gt;

&lt;p&gt;Duas pessoas chegam ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;As duas perguntam:&lt;/p&gt;

&lt;p&gt;«“A sala está livre?”»&lt;/p&gt;

&lt;p&gt;As duas recebem:&lt;/p&gt;

&lt;p&gt;«“Sim.”»&lt;/p&gt;

&lt;p&gt;Antes que uma delas entre, a outra também entra.&lt;/p&gt;

&lt;p&gt;O problema não é que a sala foi “replicada”.&lt;/p&gt;

&lt;p&gt;O problema é que duas pessoas observaram o mesmo estado antes de qualquer uma conseguir alterá-lo.&lt;/p&gt;




&lt;p&gt;👨‍💻 Matondo Pedro:&lt;/p&gt;

&lt;p&gt;Então o "if (stock &amp;gt; 0)" não resolve?&lt;/p&gt;




&lt;p&gt;👨‍🏫 João:&lt;/p&gt;

&lt;p&gt;Exatamente.&lt;/p&gt;

&lt;p&gt;Porque podemos ter:&lt;/p&gt;

&lt;p&gt;João:   if (stock &amp;gt; 0) → SIM&lt;br&gt;
Maria:  if (stock &amp;gt; 0) → SIM&lt;/p&gt;

&lt;p&gt;Os dois passaram pela condição.&lt;/p&gt;

&lt;p&gt;Então, como poderíamos impedir que duas operações conflitantes trabalhassem simultaneamente sobre o mesmo recurso?&lt;/p&gt;




&lt;p&gt;👨‍💻 Matondo Pedro:&lt;/p&gt;

&lt;p&gt;Poderíamos colocar numa fila.&lt;/p&gt;




&lt;p&gt;👨‍🏫 João:&lt;/p&gt;

&lt;p&gt;Sim. Uma fila poderia serializar as operações.&lt;/p&gt;

&lt;p&gt;Mas imagina uma loja com 10.000 clientes.&lt;/p&gt;

&lt;p&gt;Seria necessário colocar todos numa única fila?&lt;/p&gt;




&lt;p&gt;👨‍💻 Matondo Pedro:&lt;/p&gt;

&lt;p&gt;Não. Só os que estão tentando comprar o mesmo produto.&lt;/p&gt;




&lt;p&gt;👨‍🏫 João:&lt;/p&gt;

&lt;p&gt;Exatamente.&lt;/p&gt;

&lt;p&gt;Então precisamos de uma forma de controlar o acesso ao recurso que está em conflito, e não bloquear o sistema inteiro.&lt;/p&gt;

&lt;p&gt;O que poderíamos usar para isso?&lt;/p&gt;




&lt;p&gt;👨‍💻 Matondo Pedro:&lt;/p&gt;

&lt;p&gt;Um lock.&lt;/p&gt;

&lt;p&gt;Como colocar um cadeado no produto.&lt;/p&gt;




&lt;p&gt;👨‍🏫 João:&lt;/p&gt;

&lt;p&gt;Perfeito. 🔒&lt;/p&gt;

&lt;p&gt;E onde faria sentido esse lock existir?&lt;/p&gt;




&lt;p&gt;👨‍💻 Matondo Pedro:&lt;/p&gt;

&lt;p&gt;No banco de dados.&lt;/p&gt;




&lt;p&gt;👨‍🏫 João:&lt;/p&gt;

&lt;p&gt;Exatamente.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;p&gt;SELECT *&lt;br&gt;
FROM products&lt;br&gt;
WHERE id = 1&lt;br&gt;
FOR UPDATE;&lt;/p&gt;

&lt;p&gt;Esse "FOR UPDATE" permite bloquear a linha que estamos prestes a modificar.&lt;/p&gt;

&lt;p&gt;Assim, outra transação que precise de um lock incompatível nessa mesma linha terá de esperar.&lt;/p&gt;

&lt;p&gt;E agora aparece uma nova pergunta:&lt;/p&gt;

&lt;p&gt;O lock sozinho é suficiente para representar toda a compra?&lt;/p&gt;




&lt;p&gt;🎯 O método&lt;/p&gt;

&lt;p&gt;Nesta conversa, não começámos pela definição de Race Condition ou Lock.&lt;/p&gt;

&lt;p&gt;Começámos por um problema real, fizemos perguntas, testámos hipóteses e fomos descobrindo os conceitos à medida que eles se tornavam necessários.&lt;/p&gt;

&lt;p&gt;🧠 Consulta Guiada e Adaptativa: começar pelo problema e conduzir a pessoa até à descoberta da solução.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>computerscience</category>
      <category>programming</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Aprendendo Angular através de um diálogo</title>
      <dc:creator>Freitas-Mp</dc:creator>
      <pubDate>Mon, 21 Sep 2026 22:32:05 +0000</pubDate>
      <link>https://dev.to/freitasmp/aprendendo-angular-atraves-de-um-dialogo-11i0</link>
      <guid>https://dev.to/freitasmp/aprendendo-angular-atraves-de-um-dialogo-11i0</guid>
      <description>&lt;p&gt;🧠 INVESTIGAÇÃO ADAPTATIVA&lt;/p&gt;

&lt;p&gt;Dia 1 — Aprendendo Angular através de um diálogo&lt;/p&gt;

&lt;p&gt;👨‍💼 João — Entrevistador&lt;/p&gt;

&lt;p&gt;Olá, eu sou o João. Trabalho na empresa X e hoje vou conduzir uma entrevista técnica para uma vaga de Junior Frontend Developer.&lt;/p&gt;

&lt;p&gt;Vamos começar com uma situação real.&lt;/p&gt;

&lt;p&gt;Precisamos desenvolver uma aplicação para uma escola.&lt;/p&gt;

&lt;p&gt;A aplicação deve permitir fazer login, listar estudantes, cadastrar, editar e remover estudantes. Os dados vêm de uma API REST.&lt;/p&gt;

&lt;p&gt;Acabaste de criar o projeto Angular.&lt;/p&gt;

&lt;p&gt;Como começarias a organizar essa aplicação?&lt;/p&gt;

&lt;p&gt;👨‍💻 Matando Pedro — Candidato&lt;/p&gt;

&lt;p&gt;Certo. Então a primeira coisa que eu vou fazer é criar a estrutura do projeto.&lt;/p&gt;

&lt;p&gt;Vou instalar o Angular com npm, instalar a versão mais recente e o Angular já começa a definir toda a base do projeto, com services, components, HTML e toda essa estrutura inicial.&lt;/p&gt;

&lt;p&gt;Depois vou fazer uma tela de login e cadastro.&lt;/p&gt;

&lt;p&gt;Também vou criar a parte da API de estudantes.&lt;/p&gt;

&lt;p&gt;Depois vou criar uma tela para listar os estudantes, um componente.&lt;/p&gt;

&lt;p&gt;Outra tela para mostrar os detalhes do estudante.&lt;/p&gt;

&lt;p&gt;E na lista vou colocar uma opção para eliminar o estudante.&lt;/p&gt;

&lt;p&gt;Depois vou usar um Service para fazer...&lt;/p&gt;

&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;O que exatamente colocarias dentro desse Service?&lt;/p&gt;

&lt;p&gt;Imagina que tens um "StudentListComponent" e precisas buscar os estudantes através de:&lt;/p&gt;

&lt;p&gt;"GET /api/students"&lt;/p&gt;

&lt;p&gt;Quem deveria fazer essa chamada HTTP: o componente ou o Service? E por quê?&lt;/p&gt;

&lt;p&gt;👨‍💻 Matando Pedro&lt;/p&gt;

&lt;p&gt;O Service.&lt;/p&gt;

&lt;p&gt;Porque normalmente Service é algo compartilhado pela aplicação.&lt;/p&gt;

&lt;p&gt;A chamada HTTP pode ser reutilizada em diferentes partes. Se eu colocasse no componente, teria que replicar esse código sempre que criasse outro componente.&lt;/p&gt;

&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;A ideia principal está correta.&lt;/p&gt;

&lt;p&gt;Mas vamos refinar.&lt;/p&gt;

&lt;p&gt;A razão principal não é simplesmente o Service ser compartilhado.&lt;/p&gt;

&lt;p&gt;É separação de responsabilidades.&lt;/p&gt;

&lt;p&gt;O componente deve preocupar-se principalmente com a interface e interação.&lt;/p&gt;

&lt;p&gt;O Service pode encapsular a responsabilidade de obter e manipular os estudantes.&lt;/p&gt;

&lt;p&gt;Então temos:&lt;/p&gt;

&lt;p&gt;Component → Service → HttpClient → API&lt;/p&gt;

&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;Agora outra pergunta.&lt;/p&gt;

&lt;p&gt;O Service deve conter toda a lógica da aplicação?&lt;/p&gt;

&lt;p&gt;👨‍💻 Matando Pedro&lt;/p&gt;

&lt;p&gt;Não necessariamente.&lt;/p&gt;

&lt;p&gt;No Service podemos implementar helpers, providers HTTP e lógica de negócio.&lt;/p&gt;

&lt;p&gt;Ele é muito bom para comunicação externa.&lt;/p&gt;

&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;Boa. Só precisamos fazer uma precisão.&lt;/p&gt;

&lt;p&gt;Service não significa simplesmente “comunicação externa”.&lt;/p&gt;

&lt;p&gt;Ele serve para encapsular uma responsabilidade que não deveria ficar diretamente no componente.&lt;/p&gt;

&lt;p&gt;Comunicação com API é apenas um dos usos.&lt;/p&gt;

&lt;p&gt;Agora temos outro problema.&lt;/p&gt;

&lt;p&gt;A rota "/students" só pode ser acessada por usuários autenticados.&lt;/p&gt;

&lt;p&gt;O que usarias?&lt;/p&gt;

&lt;p&gt;👨‍💻 Matando Pedro&lt;/p&gt;

&lt;p&gt;Usaria o recurso do Angular chamado Guard.&lt;/p&gt;

&lt;p&gt;Ele vai proteger a rota e verificar se o acesso está autorizado.&lt;/p&gt;

&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;Exatamente.&lt;/p&gt;

&lt;p&gt;Guard.&lt;/p&gt;

&lt;p&gt;Agora aparece outro problema.&lt;/p&gt;

&lt;p&gt;Todas as requisições precisam enviar o token:&lt;/p&gt;

&lt;p&gt;"Authorization: Bearer "&lt;/p&gt;

&lt;p&gt;Temos:&lt;/p&gt;

&lt;p&gt;"GET /students"&lt;br&gt;
"POST /students"&lt;br&gt;
"PUT /students/1"&lt;br&gt;
"DELETE /students/1"&lt;/p&gt;

&lt;p&gt;Você colocaria o código do token dentro de cada método do Service?&lt;/p&gt;

&lt;p&gt;👨‍💻 Matando Pedro&lt;/p&gt;

&lt;p&gt;Não.&lt;/p&gt;

&lt;p&gt;Criaria um... um base... alguma coisa que faça esse token.&lt;/p&gt;

&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;A ideia de centralizar está correta.&lt;/p&gt;

&lt;p&gt;O recurso que procuramos é o HTTP Interceptor.&lt;/p&gt;

&lt;p&gt;Ele pode interceptar as requisições HTTP e adicionar automaticamente o token.&lt;/p&gt;

&lt;p&gt;Então agora temos:&lt;/p&gt;

&lt;p&gt;Component&lt;br&gt;
↓&lt;br&gt;
Service&lt;br&gt;
↓&lt;br&gt;
HttpClient&lt;br&gt;
↓&lt;br&gt;
Interceptor&lt;br&gt;
↓&lt;br&gt;
API&lt;/p&gt;




&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;A API devolve:&lt;/p&gt;

&lt;p&gt;"2005-03-15"&lt;/p&gt;

&lt;p&gt;Mas queremos mostrar na tela:&lt;/p&gt;

&lt;p&gt;"15/03/2005"&lt;/p&gt;

&lt;p&gt;Você colocaria essa transformação dentro do Service?&lt;/p&gt;

&lt;p&gt;👨‍💻 Matando Pedro&lt;/p&gt;

&lt;p&gt;Aqui não me vem à mente...&lt;/p&gt;

&lt;p&gt;Talvez usem Terraform?&lt;/p&gt;

&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;Boa. Não acertaste, e isso é exatamente o que queremos descobrir durante o estudo.&lt;/p&gt;

&lt;p&gt;Aqui o recurso é o Pipe.&lt;/p&gt;

&lt;p&gt;O Pipe é usado para transformar um valor na apresentação.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;p&gt;"{{ student.birthDate | date:'dd/MM/yyyy' }}"&lt;/p&gt;

&lt;p&gt;Resultado:&lt;/p&gt;

&lt;p&gt;15/03/2005&lt;/p&gt;

&lt;p&gt;Então:&lt;/p&gt;

&lt;p&gt;Service → responsabilidade e acesso aos dados.&lt;br&gt;
Pipe → transformação para apresentação.&lt;br&gt;
Component → interface e interação.&lt;/p&gt;




&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;Agora temos outro problema.&lt;/p&gt;

&lt;p&gt;Na tela queremos mostrar:&lt;/p&gt;

&lt;p&gt;João — Ativo&lt;br&gt;
Maria — Inativo&lt;br&gt;
Pedro — Ativo&lt;/p&gt;

&lt;p&gt;Queremos aplicar uma classe CSS diferente dependendo do estado.&lt;/p&gt;

&lt;p&gt;Ativo → verde.&lt;br&gt;
Inativo → cinza.&lt;/p&gt;

&lt;p&gt;Que recurso do Angular utilizarias?&lt;/p&gt;

&lt;p&gt;👨‍💻 Matando Pedro&lt;/p&gt;

&lt;p&gt;Podemos usar a directive "ngModel".&lt;/p&gt;

&lt;p&gt;Ela permite colocar condições dentro do HTML para definir cores.&lt;/p&gt;

&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;Estás perto no conceito de Directive, mas confundiste dois recursos.&lt;/p&gt;

&lt;p&gt;"ngModel" é usado principalmente para two-way data binding, especialmente em formulários.&lt;/p&gt;

&lt;p&gt;Para alterar a aparência, podemos utilizar, por exemplo:&lt;/p&gt;

&lt;p&gt;"[class.active]="student.active""&lt;/p&gt;

&lt;p&gt;ou "ngClass".&lt;/p&gt;

&lt;p&gt;Então aprendemos mais uma coisa:&lt;/p&gt;

&lt;p&gt;Directive permite adicionar ou modificar comportamento de elementos no DOM.&lt;/p&gt;

&lt;p&gt;E "ngModel" é uma directive relacionada principalmente ao binding de formulários.&lt;/p&gt;




&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;O projeto cresceu.&lt;/p&gt;

&lt;p&gt;Temos:&lt;/p&gt;

&lt;p&gt;"students/"&lt;br&gt;
→ "student-list"&lt;br&gt;
→ "student-detail"&lt;br&gt;
→ "student-form"&lt;/p&gt;

&lt;p&gt;"auth/"&lt;br&gt;
→ "login"&lt;br&gt;
→ "register"&lt;/p&gt;

&lt;p&gt;Como organizarias e agruparias esses componentes no Angular?&lt;/p&gt;

&lt;p&gt;E qual é a diferença entre NgModule e Standalone?&lt;/p&gt;

&lt;p&gt;👨‍💻 Matando Pedro&lt;/p&gt;

&lt;p&gt;Entre módulos, nós organizamos os componentes por módulos e depois vamos ter um módulo pai que vai chamar os children.&lt;/p&gt;

&lt;p&gt;E carrega as rotas.&lt;/p&gt;

&lt;p&gt;Isso facilita na eficiência de lazy loading e tudo isso.&lt;/p&gt;

&lt;p&gt;Standalone, acho que é quando temos um único módulo pai que carrega todos os ficheiros.&lt;/p&gt;

&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;A primeira parte está no caminho certo.&lt;/p&gt;

&lt;p&gt;No modelo tradicional, podemos agrupar funcionalidades através de "NgModule".&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;p&gt;"StudentsModule"&lt;br&gt;
→ "StudentListComponent"&lt;br&gt;
→ "StudentDetailComponent"&lt;br&gt;
→ "StudentFormComponent"&lt;/p&gt;

&lt;p&gt;Mas há uma correção importante.&lt;/p&gt;

&lt;p&gt;Standalone é praticamente o contrário daquilo que descreveste.&lt;/p&gt;

&lt;p&gt;Um componente Standalone pode declarar diretamente as suas dependências sem precisar pertencer a um "NgModule".&lt;/p&gt;




&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;Você mencionou lazy loading.&lt;/p&gt;

&lt;p&gt;Por que utilizaria lazy loading?&lt;/p&gt;

&lt;p&gt;Temos:&lt;/p&gt;

&lt;p&gt;"/"&lt;br&gt;
"/login"&lt;br&gt;
"/students"&lt;br&gt;
"/reports"&lt;br&gt;
"/admin"&lt;/p&gt;

&lt;p&gt;Por que não simplesmente carregar tudo quando a aplicação começa?&lt;/p&gt;

&lt;p&gt;👨‍💻 Matando Pedro&lt;/p&gt;

&lt;p&gt;Porque à medida que o projeto vai crescer, vai ficar muito lento o Angular fazer um build e descarregar todo o projeto.&lt;/p&gt;

&lt;p&gt;Isso pode matar a eficiência da aplicação.&lt;/p&gt;

&lt;p&gt;👨‍💼 João&lt;/p&gt;

&lt;p&gt;O raciocínio está correto.&lt;/p&gt;

&lt;p&gt;Só precisamos fazer uma precisão.&lt;/p&gt;

&lt;p&gt;O problema principal para o usuário não é o build ficar lento. O build acontece durante desenvolvimento ou CI.&lt;/p&gt;

&lt;p&gt;O problema é o carregamento inicial da aplicação.&lt;/p&gt;

&lt;p&gt;Sem lazy loading, o usuário pode acabar carregando recursos que ainda nem precisa.&lt;/p&gt;

&lt;p&gt;Com lazy loading, partes da aplicação podem ser carregadas quando forem necessárias.&lt;/p&gt;




&lt;p&gt;🧠 O que aconteceu nesta entrevista?&lt;/p&gt;

&lt;p&gt;Nós não começámos decorando definições.&lt;/p&gt;

&lt;p&gt;Começámos com um problema.&lt;/p&gt;

&lt;p&gt;Uma resposta gerou uma nova pergunta.&lt;/p&gt;

&lt;p&gt;A pergunta revelou uma lacuna.&lt;/p&gt;

&lt;p&gt;A lacuna levou à investigação.&lt;/p&gt;

&lt;p&gt;A investigação revelou o conceito.&lt;/p&gt;

&lt;p&gt;E o conceito foi colocado diante de outro problema.&lt;/p&gt;

&lt;p&gt;Problema → Hipótese → Pergunta → Investigação → Conceito → Aplicação → Transferência&lt;/p&gt;

&lt;p&gt;Essa é a ideia por trás da Investigação Adaptativa.&lt;/p&gt;

&lt;p&gt;«Aprender não precisa começar pela definição.&lt;/p&gt;

&lt;p&gt;Às vezes, começa por uma pergunta que revela aquilo que ainda não sabemos.»&lt;/p&gt;

</description>
      <category>angular</category>
      <category>frontend</category>
      <category>tutorial</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Capítulo 21 — Deadlock: Quando o Sistema Fica Esperando por Ele Mesmo</title>
      <dc:creator>Freitas-Mp</dc:creator>
      <pubDate>Mon, 21 Sep 2026 22:27:17 +0000</pubDate>
      <link>https://dev.to/freitasmp/capitulo-21-deadlock-quando-o-sistema-fica-esperando-por-ele-mesmo-359n</link>
      <guid>https://dev.to/freitasmp/capitulo-21-deadlock-quando-o-sistema-fica-esperando-por-ele-mesmo-359n</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi6rpq5fbt83kpwnmmbiy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi6rpq5fbt83kpwnmmbiy.png" alt=" " width="662" height="512"&gt;&lt;/a&gt;Capítulo 21 — Deadlock: Quando o Sistema Fica Esperando por Ele Mesmo&lt;/p&gt;

&lt;p&gt;Uma falha que nos obrigou a parar tudo&lt;/p&gt;

&lt;p&gt;Estávamos construindo o sistema.&lt;/p&gt;

&lt;p&gt;Tudo parecia funcionar.&lt;/p&gt;

&lt;p&gt;Até que, durante um teste de concorrência, colocamos cinco execuções fazendo a mesma operação praticamente ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;E então apareceu:&lt;/p&gt;

&lt;p&gt;ER_LOCK_DEADLOCK&lt;/p&gt;

&lt;p&gt;A princípio, parece apenas mais um erro técnico.&lt;/p&gt;

&lt;p&gt;Mas a pergunta é muito mais interessante:&lt;/p&gt;

&lt;p&gt;«O que significa, de verdade, um sistema entrar em deadlock?»&lt;/p&gt;

&lt;p&gt;Foi assim que começou a nossa investigação.&lt;/p&gt;




&lt;p&gt;🧑‍💻 Matondo Pedro&lt;/p&gt;

&lt;p&gt;João, afinal, o que aconteceu aqui?&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;Antes de falar de banco de dados, vamos esquecer programação por um momento.&lt;/p&gt;

&lt;p&gt;Imagina duas pessoas organizando documentos.&lt;/p&gt;

&lt;p&gt;👨 A está segurando um documento que B precisa.&lt;/p&gt;

&lt;p&gt;👩 B está segurando outro documento que A precisa.&lt;/p&gt;

&lt;p&gt;Então:&lt;/p&gt;

&lt;p&gt;👨 A → espera B&lt;br&gt;
👩 B → espera A&lt;/p&gt;

&lt;p&gt;Quem continua?&lt;/p&gt;

&lt;p&gt;🧑‍💻 Matondo Pedro&lt;/p&gt;

&lt;p&gt;Ninguém.&lt;/p&gt;

&lt;p&gt;A está esperando B.&lt;/p&gt;

&lt;p&gt;B está esperando A.&lt;/p&gt;

&lt;p&gt;Então fica tudo travado.&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;Exatamente.&lt;/p&gt;

&lt;p&gt;Agora temos uma descoberta.&lt;/p&gt;

&lt;p&gt;Não é simplesmente esperar que causa o problema.&lt;/p&gt;

&lt;p&gt;Se B estivesse esperando A, mas A pudesse terminar sozinho:&lt;/p&gt;

&lt;p&gt;👩 B → espera 👨 A&lt;/p&gt;

&lt;p&gt;👨 A → termina&lt;br&gt;
       ↓&lt;br&gt;
👩 B → continua&lt;/p&gt;

&lt;p&gt;Tudo ficaria bem.&lt;/p&gt;

&lt;p&gt;O problema aparece quando a espera volta para o início.&lt;/p&gt;

&lt;p&gt;👨 A → espera 👩 B&lt;br&gt;
        ↑       ↓&lt;br&gt;
        └───────┘&lt;/p&gt;

&lt;p&gt;Temos um círculo.&lt;/p&gt;




&lt;p&gt;🧑‍💻 Matondo Pedro&lt;/p&gt;

&lt;p&gt;Então, se tivermos cinco pessoas, pode ficar ainda pior?&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;Pode.&lt;/p&gt;

&lt;p&gt;Imagina:&lt;/p&gt;

&lt;p&gt;👨 A espera 👩 B&lt;br&gt;
👩 B espera 👨 C&lt;br&gt;
👨 C espera 👩 D&lt;br&gt;
👩 D espera 👨 E&lt;br&gt;
👨 E espera 👩 A&lt;/p&gt;

&lt;p&gt;Agora ninguém consegue avançar.&lt;/p&gt;

&lt;p&gt;E olha uma coisa interessante:&lt;/p&gt;

&lt;p&gt;nenhuma pessoa necessariamente fez algo errado.&lt;/p&gt;

&lt;p&gt;Cada uma simplesmente está esperando outra pessoa.&lt;/p&gt;

&lt;p&gt;O problema só aparece quando olhamos para o conjunto inteiro.&lt;/p&gt;




&lt;p&gt;Voltando para o nosso sistema&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;Agora vamos voltar para o S04.&lt;/p&gt;

&lt;p&gt;Tínhamos cinco execuções acontecendo simultaneamente:&lt;/p&gt;

&lt;p&gt;Execução A ─┐&lt;br&gt;
Execução B ─┤&lt;br&gt;
Execução C ─┼──→ mesma interactionId&lt;br&gt;
Execução D ─┤&lt;br&gt;
Execução E ─┘&lt;/p&gt;

&lt;p&gt;O cursor daquela interação ainda não existia.&lt;/p&gt;

&lt;p&gt;Então todas chegaram praticamente à mesma conclusão:&lt;/p&gt;

&lt;p&gt;«"Não existe cursor. Preciso criá-lo."»&lt;/p&gt;

&lt;p&gt;E todas tentaram fazer isso.&lt;/p&gt;

&lt;p&gt;Foi aí que apareceu o nosso:&lt;/p&gt;

&lt;p&gt;ER_LOCK_DEADLOCK&lt;/p&gt;

&lt;p&gt;🧑‍💻 Matondo Pedro&lt;/p&gt;

&lt;p&gt;Ah! Então o problema que encontramos no nosso projeto é o mesmo padrão.&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;Exatamente.&lt;/p&gt;

&lt;p&gt;Mas com uma precisão importante:&lt;/p&gt;

&lt;p&gt;não significa que o banco de dados inteiro parou.&lt;/p&gt;

&lt;p&gt;Algumas operações ficaram envolvidas numa dependência circular.&lt;/p&gt;

&lt;p&gt;O banco detectou a situação e escolheu uma ou mais transações como vítimas, desfazendo aquela operação para permitir que o sistema continuasse.&lt;/p&gt;




&lt;p&gt;🧑‍💻 Matondo Pedro&lt;/p&gt;

&lt;p&gt;Então o banco precisa "matar" alguns processos?&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;De forma simplificada, podemos dizer isso.&lt;/p&gt;

&lt;p&gt;Tecnicamente, ele pode abortar uma transação e fazer rollback.&lt;/p&gt;

&lt;p&gt;E isso produz uma descoberta interessante:&lt;/p&gt;

&lt;p&gt;«Às vezes, o erro é justamente o mecanismo que impede o sistema de ficar bloqueado para sempre.»&lt;/p&gt;




&lt;p&gt;Mas isso só acontece em bancos de dados?&lt;/p&gt;

&lt;p&gt;🧑‍💻 Matondo Pedro&lt;/p&gt;

&lt;p&gt;Essa é uma coisa que fiquei curioso.&lt;/p&gt;

&lt;p&gt;Deadlock só acontece em banco de dados?&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;Não.&lt;/p&gt;

&lt;p&gt;O banco é apenas um dos lugares onde esse problema aparece.&lt;/p&gt;

&lt;p&gt;O padrão é muito mais amplo.&lt;/p&gt;

&lt;p&gt;Pode acontecer quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👥 pessoas esperam umas pelas outras;&lt;/li&gt;
&lt;li&gt;🏭 máquinas dependem umas das outras;&lt;/li&gt;
&lt;li&gt;🚗 veículos ficam presos em uma passagem;&lt;/li&gt;
&lt;li&gt;💻 programas aguardam recursos;&lt;/li&gt;
&lt;li&gt;🗄️ transações aguardam recursos do banco.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A estrutura é sempre parecida:&lt;/p&gt;

&lt;p&gt;A possui X&lt;br&gt;
A precisa de Y&lt;/p&gt;

&lt;p&gt;B possui Y&lt;br&gt;
B precisa de X&lt;/p&gt;

&lt;p&gt;E então:&lt;/p&gt;

&lt;p&gt;A → espera B&lt;br&gt;
↑       ↓&lt;br&gt;
└───────┘&lt;/p&gt;




&lt;p&gt;🧑‍💻 Matondo Pedro&lt;/p&gt;

&lt;p&gt;Então, quando estamos projetando um sistema, precisamos levantar essas situações e tentar prever esses problemas?&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;Sim.&lt;/p&gt;

&lt;p&gt;Não conseguimos prever todos os problemas antes de construir um sistema.&lt;/p&gt;

&lt;p&gt;Mas podemos investigar:&lt;/p&gt;

&lt;p&gt;O que é compartilhado?&lt;/p&gt;

&lt;p&gt;Quem pode utilizar?&lt;/p&gt;

&lt;p&gt;Quem pode precisar esperar?&lt;/p&gt;

&lt;p&gt;Enquanto espera, o que continua segurando?&lt;/p&gt;

&lt;p&gt;Existe possibilidade de formar um ciclo?&lt;/p&gt;

&lt;p&gt;Essa análise pode revelar riscos de concorrência antes que eles apareçam em produção.&lt;/p&gt;




&lt;p&gt;Uma pequena experiência&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;Agora olha para duas situações.&lt;/p&gt;

&lt;p&gt;Primeira:&lt;/p&gt;

&lt;p&gt;👨 A → X → Y&lt;br&gt;
👩 B → Y → X&lt;/p&gt;

&lt;p&gt;Existe possibilidade de formar um ciclo.&lt;/p&gt;

&lt;p&gt;Agora mudamos a ordem:&lt;/p&gt;

&lt;p&gt;👨 A → X → Y&lt;br&gt;
👩 B → X → Y&lt;/p&gt;

&lt;p&gt;O que acontece?&lt;/p&gt;

&lt;p&gt;🧑‍💻 Matondo Pedro&lt;/p&gt;

&lt;p&gt;Aí não temos círculo.&lt;/p&gt;

&lt;p&gt;B pode esperar A.&lt;/p&gt;

&lt;p&gt;Mas A não está esperando B.&lt;/p&gt;

&lt;p&gt;Quando A terminar, B continua.&lt;/p&gt;

&lt;p&gt;Então não temos deadlock.&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;Exatamente.&lt;/p&gt;

&lt;p&gt;Acabaste de descobrir uma das estratégias fundamentais para reduzir deadlocks:&lt;/p&gt;

&lt;p&gt;«estabelecer uma ordem consistente para adquirir recursos.»&lt;/p&gt;




&lt;p&gt;E se o banco não detectasse?&lt;/p&gt;

&lt;p&gt;🧑‍💻 Matondo Pedro&lt;/p&gt;

&lt;p&gt;Mas o que aconteceria se o banco nunca detectasse aquele deadlock?&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;Imagina:&lt;/p&gt;

&lt;p&gt;A ⏳&lt;br&gt;
B ⏳&lt;/p&gt;

&lt;p&gt;Se nenhuma pudesse sair da situação, poderiam ficar esperando indefinidamente.&lt;/p&gt;

&lt;p&gt;E outras operações poderiam começar a esperar também:&lt;/p&gt;

&lt;p&gt;A ⏳&lt;br&gt;
B ⏳&lt;br&gt;
C ⏳&lt;br&gt;
D ⏳&lt;br&gt;
E ⏳&lt;br&gt;
...&lt;/p&gt;

&lt;p&gt;Isso poderia consumir conexões e outros recursos, aumentar os tempos de resposta, provocar timeouts e degradar o sistema.&lt;/p&gt;

&lt;p&gt;O sistema estaria gastando recursos sem produzir progresso útil.&lt;/p&gt;




&lt;p&gt;🧑‍💻 Matondo Pedro&lt;/p&gt;

&lt;p&gt;Agora lembrei de uma coisa!&lt;/p&gt;

&lt;p&gt;Na 42 Luanda estudamos um problema chamado Dining Philosophers — O Jantar dos Filósofos.&lt;/p&gt;

&lt;p&gt;👨‍💻 João&lt;/p&gt;

&lt;p&gt;E agora a conexão fica muito interessante.&lt;/p&gt;

&lt;p&gt;Nós não começamos pelos filósofos.&lt;/p&gt;

&lt;p&gt;Encontramos o problema primeiro no nosso sistema.&lt;/p&gt;

&lt;p&gt;Depois percebemos que existia um problema clássico que representa exatamente essa classe de situação.&lt;/p&gt;

&lt;p&gt;🍝 Dining Philosophers      Nosso sistema&lt;/p&gt;

&lt;p&gt;🧑 Filósofo                 Execução&lt;br&gt;
🍴 Garfo                    Recurso&lt;br&gt;
⏳ Espera                   Espera&lt;br&gt;
🔄 Ciclo                    Dependência circular&lt;br&gt;
🔒 Bloqueio                 Deadlock&lt;/p&gt;

&lt;p&gt;E essa é talvez a parte mais interessante da investigação.&lt;/p&gt;

&lt;p&gt;Não estudamos deadlock porque alguém começou dizendo:&lt;/p&gt;

&lt;p&gt;«"Deadlock é X."»&lt;/p&gt;

&lt;p&gt;Nós começamos com:&lt;/p&gt;

&lt;p&gt;«"Por que o nosso sistema travou?"»&lt;/p&gt;

&lt;p&gt;Investigamos.&lt;/p&gt;

&lt;p&gt;Fizemos perguntas.&lt;/p&gt;

&lt;p&gt;Criamos hipóteses.&lt;/p&gt;

&lt;p&gt;Simplificamos o problema.&lt;/p&gt;

&lt;p&gt;Encontramos o padrão.&lt;/p&gt;

&lt;p&gt;E só depois demos nome ao que havíamos descoberto:&lt;/p&gt;

&lt;p&gt;«Deadlock.»&lt;/p&gt;

&lt;p&gt;Esse é o espírito do Adaptive Inquiry: começar pelo problema real, investigar através de perguntas, descobrir o conceito e só então aprender o termo técnico.&lt;/p&gt;

&lt;p&gt;A teoria veio depois da necessidade de entendê-la.&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Coming soon !</title>
      <dc:creator>Freitas-Mp</dc:creator>
      <pubDate>Sun, 21 Nov 2021 16:21:27 +0000</pubDate>
      <link>https://dev.to/freitasmp/coming-soon--j22</link>
      <guid>https://dev.to/freitasmp/coming-soon--j22</guid>
      <description>&lt;p&gt;I will develop this application ,coming soon.&lt;br&gt;
Using Nodejs,DDD,TDD and react js&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
