Eu li cerca de 4 níveis de isolamento:
Isolation Level Dirty Read Nonrepeatable Read Phantom Read
READ UNCOMMITTED Permitted Permitted Permitted
READ COMMITTED -- Permitted Permitted
REPEATABLE READ -- -- Permitted
SERIALIZABLE -- -- --
Eu quero entender o bloqueio que cada isolamento de transação assume na mesa
READ UNCOMMITTED - no lock on table
READ COMMITTED - lock on committed data
REPEATABLE READ - lock on block of sql(which is selected by using select query)
SERIALIZABLE - lock on full table(on which Select query is fired)
abaixo estão os três fenômenos que podem ocorrer no isolamento da transação
Leitura suja - sem bloqueio
Leitura não
repetível - sem leitura suja como bloqueio em dados confirmados
Leitura fantasma - bloqueio no bloco de sql (que é selecionado usando a consulta selecionada)
Quero entender onde definimos esses níveis de isolamento: apenas no nível jdbc / hibernate ou no banco de dados também
PS: Já passei pelos links em níveis de isolamento no oracle , mas eles parecem desajeitados e falam sobre banco de dados específico
java
transactions
isolation-level
Aprendiz
fonte
fonte
Respostas:
Por exemplo, você tem 3 processos simultâneos A, B e C. A inicia uma transação, grava dados e efetua o commit / rollback (dependendo dos resultados). B apenas executa uma
SELECT
instrução para ler os dados. C lê e atualiza dados. Todos esses processos funcionam na mesma mesa T.WHERE aField > 10 AND aField < 20
, ou seja , A insere dados onde oaField
valor está entre 10 e 20, então B lê os dados novamente e obtém um resultado diferente.Usando JDBC, você o define usando
Connection#setTransactionIsolation
.Usando o Hibernate:
Onde
A configuração do Hibernate é obtida daqui (desculpe, está em espanhol).
A propósito, você também pode definir o nível de isolamento no RDBMS:
SET ISOLATION TO DIRTY READ
frase.)e assim por diante...
fonte
Como diz o brb tea, depende da implementação do banco de dados e do algoritmo que eles usam: MVCC ou Two Phase Locking.
CUBRID (RDBMS de código aberto) explica a ideia desses dois algoritmos:
O MVCC permite modificações simultâneas ao custo de aumento da sobrecarga na memória (porque tem que manter versões diferentes dos mesmos dados) e computação (no nível REPETEABLE_READ você não pode perder atualizações, então deve verificar as versões dos dados, como Hiberate faz com o Optimistick Locking ).
Em 2PL Transaction, os níveis de isolamento controlam o seguinte :
Exemplos concretos da relação entre bloqueios e níveis de isolamento no SQL Server (use 2PL, exceto em READ_COMMITED com READ_COMMITTED_SNAPSHOT = ON)
READ_UNCOMMITED: não emite bloqueios compartilhados para evitar que outras transações modifiquem os dados lidos pela transação atual. As transações READ UNCOMMITTED também não são bloqueadas por bloqueios exclusivos que impediriam a transação atual de ler linhas que foram modificadas, mas não confirmadas por outras transações. [...]
READ_COMMITED:
REPETEABLE_READ: bloqueios compartilhados são colocados em todos os dados lidos por cada instrução na transação e são mantidos até que a transação seja concluída.
SERIALIZABLE: Os bloqueios de intervalo são colocados no intervalo de valores-chave que correspondem às condições de pesquisa de cada instrução executada em uma transação. [...] Os bloqueios de intervalo são mantidos até que a transação seja concluída.
fonte
Os bloqueios são sempre feitos no nível do banco de dados: -
Documento oficial da Oracle: - Para evitar conflitos durante uma transação, um SGBD utiliza travas, mecanismos para bloquear o acesso de terceiros aos dados que estão sendo acessados pela transação. (Observe que no modo auto-commit, onde cada instrução é uma transação, os bloqueios são mantidos para apenas uma instrução.) Depois que um bloqueio é definido, ele permanece em vigor até que a transação seja confirmada ou revertida. Por exemplo, um DBMS pode bloquear uma linha de uma tabela até que as atualizações tenham sido confirmadas. O efeito desse bloqueio seria impedir que um usuário obtivesse uma leitura incorreta, ou seja, lendo um valor antes que ele se tornasse permanente. (Acessar um valor atualizado que não foi confirmado é considerado uma leitura suja porque é possível que esse valor seja revertido para seu valor anterior. Se você leu um valor que é revertido posteriormente, você leu um valor inválido. )
O modo como os bloqueios são configurados é determinado pelo que é chamado de nível de isolamento de transação, que pode variar de nenhuma transação de suporte a transações de suporte que impõem regras de acesso muito rígidas.
Um exemplo de nível de isolamento de transação é TRANSACTION_READ_COMMITTED, que não permitirá que um valor seja acessado antes de ser confirmado. Em outras palavras, se o nível de isolamento da transação for definido como TRANSACTION_READ_COMMITTED, o DBMS não permitirá que ocorram leituras sujas. A interface Connection inclui cinco valores que representam os níveis de isolamento da transação que você pode usar no JDBC.
fonte