Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PostgreSQL MVCC Internals

PostgreSQL MVCC Internals

Daniel Libanori

May 08, 2020
Tweet

More Decks by Daniel Libanori

Other Decks in Programming

Transcript

  1. Problema clássico • Alice precisa transferir R$ 50,00 de sua

    conta para a conta de Bob • Subtrai R$ 50,00 da conta de Alice • Adiciona R$ 50,00 na conta de Bob
  2. ACID • Atomicity: todos as instruções serão executadas ou nenhuma

    • Consistency: garantia de constraints serão seguidas • Isolation: transações não são afetadas por outras transações • Durability: uma transação comitada não será perdida por erros posteriores
  3. How it works? • MVCC: Multiversion concurrency Control • Common

    technique • Bancos de dados: PostgreSQL, MySQL, Oracle, CouchDB, HBase, etcd • Linguagens: PyPy, Clojure e RUBY!
  4. MVCC: Ideia básica • Baseada em timestamp • Cada linha

    tem um timestamp de quando ela foi criada ou atualizada • Cada transação só pode ver linhas com um timestamp anterior ao seu
  5. Na prática • Transação começou em 1050 • UPDATE mvcc

    SET n = 0.34 WHERE id = 1; • Transição concluiu em 1100 id n 1 0,17 1 0,34 id n ts (ms) 1 0.17 800 1 0,34 1100 O que você vê O que realmente acontece
  6. Perguntas • Supondo que estamos em 1300 • O que

    vê a transação T1 que começou em 1200? • O que vê a transação T2 que começou em 900? id n ts (ms) 1 0.17 800 1 0,34 1100
  7. PostgreSQL ((Xmin == my-transaction && Cmin < my-command && (Xmax

    is null || (Xmax == my-transaction && Cmax >= my-command))) || (Xmin is committed && (Xmax is null || (Xmax == my-transaction && Cmax >= my-command) || Xmax != my-transaction && Xmax is not committed)))) inserted by the current transaction before this command, and the row has not been deleted, or it was deleted by the current transaction but not before this command, or the row was inserted by a committed transaction, and the row has not been deleted, or the row is being deleted by this transaction but it’s not deleted "yet", or the row was deleted by another transaction that has not been committed
  8. Na prática MESMO • Identificador da transação não é um

    timestamp, é um sequencial • Pode ser obtido com: SELECT txid_current(); • Há vários outros campos para conseguir fazer a “matemágica” de isolamento de uma transação • System Columns: xmin, xmax, cmin, cmax, ctid, oid e tableoid • Outros campos ctid, oid e tableoid não são relevantes para as transações • Porém, ctid nos será útil para demonstração do MVCC
  9. System Columns • xmin: transação de INSERT ou UPDATE •

    xmax: transação de UPDATE ou DELETE • cmin: sequência do comando dentro da transação associado ao xmin • cmax: sequência do comando dentro da transação associado ao xmax • ctid: localização física de uma linha
  10. Informações de uma page • SELECT * FROM page_header(get_raw_page('mvcc', 0));

    • SELECT * FROM heap_page_items(get_raw_page('mvcc', 0)); • /src/include/storage/itemid.h • https://www.postgresql.org/docs/11/storage-page-layout.html
  11. VACUUM • Remove linhas que não são mais “acessíveis” por

    nenhuma transação • Não libera espaço em disco • Libera espaço nas pages • Melhora performance • Alta demanda de recursos: processamento e, principalmente, I/O • Não faz parte do Standard SQL • autovacuum daemon
  12. WAL • Write-Ahead Log • Common Technique • Escreve no

    log de transações depois atualiza as pages • COMMIT aguarda flush para memória não-volátil • Recuperação de CRASH através de leitura do log • pg_waldump
  13. Bonus: anomalias • Dirty read: dados modificados por outra transação

    não comitada • Non-repeatable read: dados modificados por outra transação comitada • Phatom read: alteração no conjunto de linhas retornadas • Serialization anomaly: instruções das transações estão embaralhadas
  14. Bonus: Isolation Levels • Read uncommitted: vê dados de transações

    não coitadas • Read committed: vê dados de transações comitadas • Repeatable read: vê dados somente de transações anteriores • Serializable: vê cada transação como um conjunto coeso de instruções seriais