ISOLATION nos Bancos de Dados
Published: 2019-08-04,
Updated: 2018-02-08
Explicação sobre os fenomenos ocorridos nos niveis de isolamento
dirty read
- A transaction reads data written by a concurrent uncommitted transaction.
nonrepeatable read
- A transaction re-reads data it has previously read and finds that data has been modified by another transaction (that committed since the initial read).
phantom read
- A transaction re-executes a query returning a set of rows that satisfy a search condition and finds that the set of rows satisfying the condition has changed due to another recently-committed transaction.
- READ UNCOMMITTED não funciona no PostgreSQL agindo como a READ COMMITED
- READ COMMITED voce lê apenas o que foi comitado e escreve de forma sequencial, nunca vai receber exceção de concorrencia
- REPEATABLE READ funciona exatamente como tem que funcionar, mesmo que os outros comitem voce nao ve e ele diz que nao tem phantom read
- SERIALIZABLE os selects nao sao locados mas na hora de fazer update se os dois tentarem fazer set do mesmo registro o segundo leva concurrent update exception, o interessante eh que quando se faz um update como
UPDATE X SET val=val-1
não se tem problemas de concorrencia
Niveis de isolamento
- READ UNCOMMITTED exatamente como deveria ser
- READ COMMITED extamente como deveria ser
- REPEATABLE READ funciona exatamente como tem que funcionar, mesmo que os outros comitem voce nao ve e ele diz que nao tem phantom read
- SERIALIZABLE os selects concorrentes nao sao locados, se alguem fizer update entao o select passa a ser locado e na hora de fazer update se os dois tentarem fazer set do mesmo registro o segundo leva concurrent update exception
Nivel default no innoDB
REPEATABLE READ
Mudar o nivel de isolamento
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
Pegar o isolation level atual
SHOW VARIABLES LIKE 'tx_isolation';
Não funcionou tudo é como se fosse READ COMMITED conforme eles documentam.
Please note MVCC is enabled in version 1.4.x by default, when using the MVStore. In this case, table level locking is not used. Instead, rows are locked for update, and read committed is used in all cases (changing the isolation level has no effect).
usando o modelo 2PL ele ignora o level e funciona como se fosse read committed
Usando MVCC
jdbc:hsqldb:mem:test;hsqldb.tx=mvcc
# ou
SET DATABASE TRANSACTION CONTROL MVCC
- READ UNCOMMITTED funciona como READ COMMITED
- READ COMMITED exatamente como deveria ser
- REPEATABLE READ igual o serializable
- SERIALIZABLE como deveria ser, os dois lêem, mas na hora do update o segundo toma exception
Java Test Commands
Sublime Atalhos
Comments