ISOLAMENTO
Sintaxe
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
Descrição
Esta instrução define o nível de isolamento da transação globalmente, para a sessão atual, ou para a próxima transação:
- Com a palavra-chave
GLOBAL
, a instrução define o nível padrão de transação globalmente para todas as demais sessões. As sessões existentes não são afetadas.
- Com a palavra-chave
SESSION
, a instrução define o nível padrão de transação para todas as demais transações subseqüentes realizadas dentro da sessão atual.
- Sem as palavras-chave
SESSION
ouGLOBAL
, a instrução define o nível de isolamento para a próxima transação (não iniciada) realizada dentro da sessão atual.
Uma mudança no nível padrão de isolamento requer o SUPER privilégio
. Qualquer sessão é livre de mudar seu nível de isolamento (mesmo no meio de uma transação), ou o nível de isolamento para sua próxima transação.
Para definir o nível padrão global de isolamento na inicialização do servidor, use a opção --transaction-isolation=level
para mysqld na linha de comando ou num arquivo de opção. Valores de nível para esta opção usam traços em vez de espaços, portanto os valores permitidos são READ-UNCOMMITTED
, READ-COMMITTED
, REPEATABLE-READ
, ou SERIALIZABLE
. Por exemplo, para definir o nível padrão de insolamento como REPEATABLE READ
, use estas linhas na seção [mysqld] de um arquivo de opção:
[mysqld] transaction-isolation = REPEATABLE-READ
Para determinar os níveis de isolamento de transação global e de sessão em tempo de execução, verifique o valor da variável de sistema tx_isolation:
SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
InnoDB suporta cada um dos níveis de isolamento de transação aqui descritos, utilizando diferentes estratégias de bloqueio. O nível padrão é REPEATABLE READ
.
Para informações adicionais sobre bloqueios a nível de registros no InnoDB, e de como ele os usa para executar varios tipos de instruções, veja https://dev.mysql.com/doc/refman/en/innodb-locking.html, e https://dev.mysql.com/doc/refman/5.1/en/innodb-locks-set.html.
As seguintes seções describem como o MySQL suporta diferentes níveis de transação:
READ UNCOMMITTED (Leitura não confirmada)
As instruções SELECT
são realizadas de um modo não bloqueante, mas uma possível versão anterior de uma linha pode ser usada. Assim, ao usar este nível de isolamento, tais leituras não são consistentes. Isto também é chamado de "leitura suja". Caso contrário, este nível de isolamento funciona como READ COMMITTED
.
READ COMMITTED (Leitura confirmada)
Um nível de isolamento ligeiramente parecido com o Oracle em relação as leituras consistentes (não-bloqueantes): Cada leitura consistente, mesmo dentro da mesma transação, define e lê sua própia cópia atual. Veja https://dev.mysql.com/doc/refman/en/innodb-consistent-read.html.
Para leituras bloqueantes (SELECT
com FOR UPDATE
ou LOCK IN SHARE MODE
), InnoDB bloqueia somente registros índice, e não as brechas antes deles, e assim permite a livre inserção de novos registros próximos a registros bloqueados. Para as instruções UPDATE
e DELETE
, o bloqueio depende se a instrução usa um índice exclusivo com una condição exclusiva de busca (tal como WHERE id = 100
), ou uma condição de busca do tipo gama (tal como WHERE id > 100
). Para um índice exclusivo com uma condição exclusiva de busca, InnoDB bloqueia somente o registro índice encontrado, e não o vácuo anterior a ele. Para buscas tipo gama, InnoDB bloqueia a gama do índice escaneada, usando bloqueios gap ou bloqueios next-key (gap mais registro-índice) para bloquear inserções de outras sessões nos vácuos cobertos pela gama. Isto é necessário porque "linhas fantasma" devem ser bloqueadas para que a replicação do MYSQL e a recuperação funcionem.
Nota: No MariaDB 5.1, se o nível de isolamento READ COMMITTED
for usado ou a variável de sistema innodb_locks_unsafe_for_binlog estiver habilitada, não haverá gap locking do InnoDB com exceção da verificação de restrição de chave estrangeira e a verificação da chave duplicada. Além disso, bloqueios de registro para linhas não correspondentes são liberados após o MySQL ter avaliado a condição WHERE
. A partir do MySQL 5.1, se você usar READ COMMITTED
ou habilita o innodb_locks_unsafe_for_binlog, você deve usar logs binários baseados em linhas.
REPEATABLE READ (Leitura Repetida)
Este é o nível de isolamento padrão para InnoDB. Para leituras consistentes, há uma diferença importante com respeito ao nível de isolamento READ COMMITTED
: Todas as leituras consistentes dentro da mesma transação lêem a cópia estabelecida pela primeira leitura. Esta convenção significa que se você emitir varias instruções SELECT
simples (sem bloqueio) dentro da mesma transação, estas instruções SELECT
também são consistentes entre si. Veja https://dev.mysql.com/doc/refman/en/innodb-consistent-read.html.
Para leituras bloqueantes (SELECT with FOR UPDATE or LOCK IN SHARE MODE), instruções UPDATE e DELETE, o bloqueio depende se a instrução usa um índice exclusivo com uma condição exclusiva de busca, ou uma condição de busca do tipo gama. Para um índice exclusivo com uma condição exclusiva de busca, InnoDB bloqueia só o registro índice encontrado, e não o vácuo anterior a ele. Para outras condições de busca, InnoDB bloqueia a gama do índice digitalizado, usando bloqueios gap ou bloqueios next-key (gap mais registro-índice) para bloquear inserções de outras sessões dentro dos vácuos cobertos pela gama.
SERIALIZABLE == (Serializável)
Este nível é parecido com o REPEATABLE READ, mas InnoDB converte implicitamente todas as instruções simples SELECT para SELECT ... LOCK IN SHARE MODE se a auto-confirmação estiver desativada. Se a confirmação automática estiver habilitada, o SELECT será sua própria transação. Portanto, ele é conhecido por ser de somente leitura e pode ser serealizado se for realizado como uma leitura consistente (sem bloqueio) e não precisar do bloqueio de outras transações. (Isto significa que para forçar um SELECT simples a bloquear se outras transações têm alterado as linhas selecionadas, você deve desativar a confirmação automática.)