Upload
locaweb
View
81
Download
6
Embed Size (px)
Citation preview
Isolamento e MVCCJosé Arthur Benetasso Villanova
[email protected] Engineering
Características de um banco transacional
AtomicConsistentIsolatedDurable
Características de um banco transacional
Atomic: Tudo ou nadaConsistent: O dado é válido no contextoIsolated: Uma transação não atrapalha a outraDurable: Gravado em uma mídia durável (disco normalmente)
Fenômenos de Isolamento
Isolation Level
Dirty Read Non-Repeatable Read
Phantom Read Notes
Read Uncommited
Possible* Possible Possible SQL Server WITH (NOLOCK)PostgreSQL não tem
Read Commited
Not Possible Possible Possible Padrão do SQL Server e PostgreSQL
Repeatable Read
Not Possible Not Possible Possible* Padrão InnoDB, não é possível Phantom Read
Serializable Not Possible Not Possible Not Possible
Dirty ReadsTransaction 1
SELECT age FROM users WHERE id = 1;-- retorna 20
SELECT age FROM users WHERE id = 1;-- retorna 21
Transaction 2
BEGIN;UPDATE users SET age = 21 WHERE id = 1;
ROLLBACK;
Non-repeatable ReadsTransaction 1
SELECT * FROM users WHERE id = 1;
SELECT * FROM users WHERE id = 1;COMMIT;
Transaction 2
UPDATE users SET age = 21 WHERE id = 1;COMMIT;
Phantom ReadsTransaction 1
SELECT * FROM usersWHERE age BETWEEN 10 AND 30;
SELECT * FROM usersWHERE age BETWEEN 10 AND 30;COMMIT;
Transaction 2
INSERT INTO users VALUES ( 3, 'Bob', 27 );COMMIT;
Estratégias para manter a consistência
● Locks○ Muitas locks travando banco e baixando a
performance● MVCC (Multiversion Concurrency Control)
○ Cópias do mesmo registro para um grupo de transações
MVCC
● Readers never block writers, and writes never block readers
● Conceito criado na década de 70, mas somente colocado em prática na década de 80 por limitações das máquinas
MVCC - Quem usa?Altibase Druid HypergraphDB NuoDB ScimoreDB
ArangoDB EXASOL InfiniDB Netezza sones GraphDB
Berkeley DB eXtremeDB Ingres ObjectStore Sybase SQL Anywhere
Bigdata Firebird InterBase Oracle database Sybase IQ
Cloudant FLAIM MariaDB OrientDB ThinkSQL
Clustrix FoundationDB MarkLogic Server PostgreSQL Tibero
Couchbase GE Smallworld Version Managed Data Store
MemSQL Rdb/ELN TokuMX
CouchDB H2 Database Engine MDB RDM Embedded Zope Object Database
IBM DB2 Hawtdb Meronymy SPARQL Database Server
REAL Server
IBM Cognos TM1 HBase (Apache HBase) Microsoft SQL Server RethinkDB
Drizzle HSQLDB MySQL SAP HANA
MVCC - PostgreSQL
● Cada transação cria seu próprio snapshot da base de dados
● Este snapshot não contém os dados mais atualizados, contém os dados do momento que a transação iniciou
MVCC - PostgreSQL
Como funciona?
MVCC - PostgreSQL
MVCC - PostgreSQL
● As consequências deste modelo é uma grande quantidade de dados duplicados no banco
● O PostgreSQL não mantém uma lista da transações correntes e a visibilidade do registros, e por isso ele não apaga ou marca para apagar os registros passados
MVCC - PostgreSQL
● Os novos registros são alocados se possível na mesma página de dados que os antigos, mas nem sempre isso é possível já que uma página tem 8192 bytes (8K)
MVCC - PostgreSQL
● Os registros deixados para trás são recuperados por outro processo o VACUUM;
● Registros são marcados como não utilizados mais, mas não são removidos, causando fragmentação do banco de dados○ Exceção: se uma página fica vazia e está no final do
arquivo, ela é removida pelo VACUUM
MVCC - PostgreSQL
● VACUUM FULL ou CLUSTER○ Criam uma nova tabela de forma ordenada e
apagam a original, liberando espaço○ Processo lento e necessita de bastante espaço livre○ Precisa efetivamente de LOCKS no banco para
funcionar, travando escritas○ Se espaço for um problema, adicione discos
MVCC - PostgreSQL
● Existem muitos estudos e otimizações dentro do banco de dados para minimizar este problema de espaço e consequentemente performance
MVCC - PostgreSQLze=# select xmin,xmax,cmin,cmax,* from ze; xmin | xmax | cmin | cmax | k | v ---------+------+------+------+---+--------------- 3342006 | 0 | 11 | 11 | 1 | Oi 3342006 | 0 | 11 | 11 | 2 | Tudo bem? 3342006 | 0 | 11 | 11 | 3 | Até Breve 3342014 | 0 | 0 | 0 | 4 | Olá novamente(4 registros)
MVCC - PostgreSQL● xmin: número da transação que criou o registro● xmax: número da maior transação que pode ver o
registro, quem apagou o registro (ou atualizou)● cmin: comando mínimo que consegue ver o registro
(dentro de uma transação)● cmax: comando máximo que pode ver o registro dentro
da transação
MVCC - PostgreSQL● Transação analisada: 35● Transações em progresso: 15 e 35
● Transação 15: possui o registro vermelho, amarelo e os verdes em seu snapshot
● Transação 35: Não tem o vermelho, tem ou não o amarelo dependendo do isolamento, e vê ambos os verdes
MVCC - Outros bancos
● Oracle e MySQL: possuem uma área de UNDO ao invés de gravar no bloco os registros expirados
● SQL Server: não utiliza o MVCC por padrão, é necessário ativar o mecanismo através do comando:SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Referênciashttp://en.wikipedia.org/wiki/Isolation_%28database_systems%29http://en.wikipedia.org/wiki/Multiversion_concurrency_controlhttp://momjian.us/main/presentations/https://dev.mysql.com/doc/refman/5.6/en/innodb-transaction-model.htmlhttp://www.postgresql.org/docs/9.4/static/transaction-iso.htmlhttps://msdn.microsoft.com/en-us/library/ms173763.aspx
We want you!Junte-se ao nosso clã para batalhas!● LightServants● #P9VPVCOP
Comente “MVCC” no pedido