Diário Fullstack 3: Iniciando meus estudos em banco de dados e entendendo ACID
No diário anterior você percebeu que eu fiz apenas um Hello world
para sentir que comecei alguma coisa, e agora é a hora de parar, respirar e estudar.
O primeiro ponto que preciso entender é: que tipo de banco de dados usarei? relacional ou não relacional(noSQL)? Se for noSQL, ainda posso escolher entre bancos colunares, baseado em grafos, documentos e chave-valor.
Para começar nessa jornada, meu caro amigo Rafael Tardivo me recomendo um curso de um indiano porreta do Youtube, Hussein Nasser, Database Engines Crash Course, que consegui numa promoção, pagando R$ 29,90.
ACID
Como primeiro tópico do curso, Nasser inicia falando de algo que já tinha visto na faculdade - partiu rever material - que é "A.C.I.D".
ACID é uma sigla que representa os 4 pilares necessários para a realização de uma transação em um banco de dados. Essa sigla representa:
- Atomicidade;
- Consistência;
- Isolamento;
- Durabilidade.
Transação? O que é isso?
O que é uma transação
Uma transação é um conjunto de operações(queries) tratadas como apenas uma. Ex: você precisa fazer um INSERT em uma conta bancária e depois um UPDATE. Essas 2 operações só ficarão permanentes no banco de dados se ambos forem executadas com sucesso. Se houver falha em alguma delas, é possível cancelar a transação, fazendo que com essas operações sejam descartadas, inclusive as que foram bem sucedidas.
Imagem adaptada do artigo da Fauna
Atomicidade
Atomicidade, o primeiro dos conceitos, significa que uma transação ou será totalmente executada, ou não será executada.
Ex: recentemente eu fui no concerto do Senhor dos Anéis aqui no Ibirapuera - foi top, inclusive. Eu precisei reservar meu assento e depois efetuar seu pagamento. Da mesma forma, podemos pensar que essas duas ações fazem parte de uma mesma operação(transação):
- Reservar meu assento
- Pagar pelo assento
A transação garantirá que ambas as operações, reserva e pagamento, mesmo que independentes, ocorrerão em um mesmo bloco de execução. Se qualquer uma das duas falhar, a transação toda será revertida, e minha reserva será liberada para outra transação.
Consistência
A execução de uma transação levará o banco de dados de um estado consistente para outro estado consistente, para isso, passando por todas as restrições previstas(triggers, integridade referencial e etc).
Ex: imagine o caso onde exista uma tabela "usuários" e "compras", onde entre elas exista uma integridade referencial, pois o id
do usuário está presente em uma linha da tabela "compras". Se você tentar remover o usuário, aoperação será impedida, pois essa dependência ocorre da forma como foi modelada.
Isolamento
Uma transação em andamento deve permanecer isolada de outra transação, ou seja, uma transação não deve interferir em outra transação concorrente.
Pensando nisso, surge outro conceito em banco de dados que se chama "níveis de isolamento"(isolation levels), que é justamente isso: transações afetando, ou não, ou até que ponto, outras transação que são executadas simultaneamente. Quando existe essa interferência, chamaremos isso de "fenômeno de leitura"(read phenomenon).
Fenômenos de leitura
Leitura suja(Dirty read)
Este fenômeno acontece quando uma transação lê dados que ainda não foram comitados. Sendo assim, os dados podem variar muito, pois não sabemos se a outra transação terá suas operações comitadas ou revertidas.
Leitura não repetível(Non-repeatable read)
Este fênomeno acontece quando em uma transação as mesmas informações são lidas 2 vezes, mas com valores diferentes, pois a linha foi alterada e comitada por outra transação.
Leitura fantasma(Phantom read)
Este fênomeno é parecido com o anterior, mas afeta apenas queries quee procurem por múltiplas linhas ao invés de uma - nesse nosso caso eu somei o valor de todos as linhas da tabela. Neste caso, o valor foi diferente do que deveria ser, pois foi recentemente comitado por outra transação, que nesse caso está fazendo um insert, mas poderia estar atualizando ou removendo outras linhas.
Anomalia na serialização(Serialization anomaly)
Este fênomeno acontece quando um grupo de transações concorrentes e comitadas simultaneamente tem seus resultados sobrepostos uma a outra.
Níveis de isolamento
Os níveis de isolamento da transação são a medida da qual o isolamento da transação é executado com sucesso. Cada nível de isolamento é definido pela presença de nenhum, um ou mais fenômenos, sendo eles:
Leitura não comitada
Sem isolamento. Qualquer mudança, comitada ou não, poderá ser vista na transação.
Leitura comitada
As queries de uma transação só enxergam o que foi comitado por outras transações.
Leitura repetida
A transação garantirá que enquanto uma query estiver lendo uma linha, ela permanecerá igual enquanto estiver sendo executada.
Serializável
Esse o nível mais bruto. As transações serão executadas uma após a outra, ao invés de concorrentes.
Nível de isolamento | Leitura suja | Leitura não repetível | Leitura fantasma | Anomalia na serialização |
---|---|---|---|---|
Leitura não comitada | Pode ocorrer | Pode ocorrer | Pode ocorrer | Pode ocorrer |
Leitura comitada | - | Pode ocorrer | Pode ocorrer | Pode ocorrer |
Leitura repetida | - | - | - | Pode ocorrer |
Serializável | - | - | - | - |
Durabilidade
Durabilidade significa que os efeitos de uma transação comitada são permanentes, de forma que mesmo que exista uma falha, ou o sistema seja reiniciado, as informações permanacerão lá, tal como estavam anteriormente.