<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ACID on Geovane Cavalcante</title><link>https://geovanecavalcante.com/tags/acid/</link><description>Recent content in ACID on Geovane Cavalcante</description><generator>Hugo -- gohugo.io</generator><language>pt-br</language><lastBuildDate>Tue, 16 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://geovanecavalcante.com/tags/acid/index.xml" rel="self" type="application/rss+xml"/><item><title>Saiba o que é ACID no contexto de bancos de dados SQL</title><link>https://geovanecavalcante.com/posts/acid-bancos-de-dados-sql/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate><guid>https://geovanecavalcante.com/posts/acid-bancos-de-dados-sql/</guid><description>&lt;img src="https://geovanecavalcante.com/posts/acid-bancos-de-dados-sql/cover.png" alt="Featured image of post Saiba o que é ACID no contexto de bancos de dados SQL" />&lt;p>Naturalmente, quando se começa a estudar sobre desenvolvimento de software e a criar as primeiras aplicações, você logo começa a se deparar com o famoso banco de dados. À primeira vista, você entende que o banco de dados serve para guardar/agrupar as informações das suas aplicações e, na maioria das vezes, o primeiro contato sempre é com um banco SQL.&lt;/p>
&lt;p>Nos primeiros usos, você vê que as coisas começam a fazer sentido, começa de fato a entender como as informações podem ser estruturadas e persistidas. É mágico!&lt;/p>
&lt;p>Recentemente, comecei a me aprofundar mais sobre bancos de dados e suas particularidades, entendendo melhor seus conceitos, fundamentos e comportamentos. Nesse estudo, me deparei com um acrônimo interessante chamado ACID, que carrega características importantes para bancos de dados SQL.&lt;/p>
&lt;p>Nesse post vamos falar um pouco sobre esse tal de ACID e entender como ele descreve algumas características importantes em transações de bancos de dados SQL.&lt;/p>
&lt;h2 id="a---atomicidade">A -&amp;gt; Atomicidade
&lt;/h2>&lt;p>Garante que operações feitas sejam atômicas. Por exemplo, modificações feitas em conjunto só devem ser concluídas em caso de sucesso de todas. Em outras palavras, a operação é tratada como indivisível.&lt;/p>
&lt;p>Um exemplo simples é uma transferência entre duas contas:&lt;/p>
&lt;p>Resultado de sucesso:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>Conta A: -100
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Conta B: +100
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Transação confirmada.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Resultado 2, com falha:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>Conta A: sem alteração
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Conta B: sem alteração
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Transação desfeita.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>O resultado abaixo não deve acontecer:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>Conta A: -100
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Conta B: sem alteração
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Não pode haver um estado parcialmente executado. A operação precisa acontecer por completo ou não acontecer.&lt;/p>
&lt;p>Exemplo de SQL que garante atomicidade:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sql" data-lang="sql">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">BEGIN&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">UPDATE&lt;/span> contas
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">SET&lt;/span> saldo &lt;span style="color:#f92672">=&lt;/span> saldo &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">WHERE&lt;/span> id &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">UPDATE&lt;/span> contas
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">SET&lt;/span> saldo &lt;span style="color:#f92672">=&lt;/span> saldo &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">WHERE&lt;/span> id &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">COMMIT&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Caso algo dê errado, a transação pode ser desfeita:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sql" data-lang="sql">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">BEGIN&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">UPDATE&lt;/span> contas
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">SET&lt;/span> saldo &lt;span style="color:#f92672">=&lt;/span> saldo &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">WHERE&lt;/span> id &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">UPDATE&lt;/span> contas
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">SET&lt;/span> saldo &lt;span style="color:#f92672">=&lt;/span> saldo &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">WHERE&lt;/span> id &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">2&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">ROLLBACK&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Nesse caso, as alterações feitas dentro da transação não são persistidas.&lt;/p>
&lt;h2 id="c---consistência">C -&amp;gt; Consistência
&lt;/h2>&lt;p>A consistência é feita por meio de regras que são definidas nas estruturas do banco e que garantem que algumas operações respeitem o formato esperado dos dados.&lt;/p>
&lt;p>Como, por exemplo: todo usuário precisa ter um e-mail único na tabela de &lt;code>users&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sql" data-lang="sql">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">CREATE&lt;/span> &lt;span style="color:#66d9ef">TABLE&lt;/span> users (
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> email TEXT &lt;span style="color:#66d9ef">NOT&lt;/span> &lt;span style="color:#66d9ef">NULL&lt;/span> &lt;span style="color:#66d9ef">UNIQUE&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Outro exemplo: todo usuário precisa ter um centro de custo válido atrelado.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sql" data-lang="sql">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">CREATE&lt;/span> &lt;span style="color:#66d9ef">TABLE&lt;/span> users (
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cost_center_id INT &lt;span style="color:#66d9ef">NOT&lt;/span> &lt;span style="color:#66d9ef">NULL&lt;/span> &lt;span style="color:#66d9ef">REFERENCES&lt;/span> cost_centers(id)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Existem algumas restrições que garantem a consistência dos dados que serão armazenados.&lt;/p>
&lt;p>Como:&lt;/p>
&lt;ul>
&lt;li>&lt;code>PRIMARY KEY&lt;/code>&lt;/li>
&lt;li>&lt;code>FOREIGN KEY&lt;/code>&lt;/li>
&lt;li>&lt;code>NOT NULL&lt;/code>&lt;/li>
&lt;li>&lt;code>UNIQUE&lt;/code>&lt;/li>
&lt;li>&lt;code>CHECK&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Essas regras ajudam o banco a impedir que dados inválidos sejam gravados, mantendo o banco sempre em um estado consistente.&lt;/p>
&lt;h2 id="i---isolamento">I -&amp;gt; Isolamento
&lt;/h2>&lt;p>Isolamento garante que uma transação não interfira de forma indevida em outra transação que esteja acontecendo ao mesmo tempo.&lt;/p>
&lt;p>Em uma aplicação real, várias pessoas podem estar usando o sistema ao mesmo tempo. Com isso, podem existir várias operações acontecendo no banco simultaneamente. O isolamento define como o banco deve lidar com esse tipo de concorrência.&lt;/p>
&lt;p>Imagine duas transações tentando alterar o saldo da mesma conta:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>Transação 1: sacar R$ 100,00
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Transação 2: sacar R$ 50,00
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Se as duas transações lerem o mesmo saldo ao mesmo tempo e atualizarem a conta sem nenhum controle, uma operação pode acabar sobrescrevendo a outra ou trabalhando com um valor desatualizado.&lt;/p>
&lt;p>O banco usa mecanismos como locks e níveis de isolamento para evitar esse tipo de problema.&lt;/p>
&lt;p>Um exemplo em SQL:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sql" data-lang="sql">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">BEGIN&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">SELECT&lt;/span> saldo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">FROM&lt;/span> contas
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">WHERE&lt;/span> id &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">FOR&lt;/span> &lt;span style="color:#66d9ef">UPDATE&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">UPDATE&lt;/span> contas
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">SET&lt;/span> saldo &lt;span style="color:#f92672">=&lt;/span> saldo &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">WHERE&lt;/span> id &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">COMMIT&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Nesse caso, o &lt;code>FOR UPDATE&lt;/code> indica que aquela linha será atualizada, então o banco pode bloquear outras transações que tentem modificar a mesma linha ao mesmo tempo.&lt;/p>
&lt;p>Esse comportamento pode variar de acordo com o banco de dados e com o nível de isolamento configurado, mas a ideia principal é evitar que transações simultâneas gerem resultados inconsistentes.&lt;/p>
&lt;h2 id="d---durabilidade">D -&amp;gt; Durabilidade
&lt;/h2>&lt;p>Durabilidade garante que, depois que uma transação é confirmada, os dados realmente foram persistidos.&lt;/p>
&lt;p>Ou seja, se o banco retornou sucesso depois de um &lt;code>COMMIT&lt;/code>, espera-se que aquela informação continue existindo mesmo que ocorra alguma falha logo depois, como uma queda de energia ou reinicialização do servidor.&lt;/p>
&lt;p>Exemplo:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sql" data-lang="sql">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">BEGIN&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">INSERT&lt;/span> &lt;span style="color:#66d9ef">INTO&lt;/span> pedidos (cliente_id, total)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">VALUES&lt;/span> (&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">250&lt;/span>.&lt;span style="color:#ae81ff">00&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">COMMIT&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Depois do &lt;code>COMMIT&lt;/code>, esse pedido precisa continuar existindo no banco de dados.&lt;/p>
&lt;p>Para garantir isso, os bancos usam alguns mecanismos internos, como logs de transação e estratégias de recuperação. A ideia é que, mesmo em caso de falha, o banco consiga recuperar as operações que já tinham sido confirmadas.&lt;/p>
&lt;p>Na prática, a durabilidade é o que permite confiar que uma operação confirmada não vai simplesmente desaparecer.&lt;/p>
&lt;h2 id="conclusão">Conclusão
&lt;/h2>&lt;p>ACID é um conceito muito importante quando começamos a entender bancos de dados além do uso básico de criar tabelas, inserir e buscar informações.&lt;/p>
&lt;p>Recapitulando:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Atomicidade&lt;/strong>: tudo acontece ou nada acontece.&lt;/li>
&lt;li>&lt;strong>Consistência&lt;/strong>: as regras do banco continuam sendo respeitadas.&lt;/li>
&lt;li>&lt;strong>Isolamento&lt;/strong>: transações simultâneas não interferem indevidamente umas nas outras.&lt;/li>
&lt;li>&lt;strong>Durabilidade&lt;/strong>: depois do &lt;code>COMMIT&lt;/code>, os dados confirmados devem persistir.&lt;/li>
&lt;/ul>
&lt;p>No começo, parece só mais um termo técnico, mas ele ajuda bastante a entender como os bancos SQL lidam com transações e como eles conseguem manter os dados confiáveis mesmo com várias operações acontecendo ao mesmo tempo.&lt;/p></description></item></channel></rss>