Locks Definidos por Diferentes Instruções SQL no InnoDB
SELECT ... FROM ...
: esta é uma leitura consistente, lendo uma cópia do banco de dados e não defininfo travas.
SELECT ... FROM ... LOCK IN SHARE MODE
: atribui travas de chave seguinte compratilhadas em todos os regitros de índices que a leitura encontrar.SELECT ... FROM ... FOR UPDATE
: atribui travas de chave seguinte exclusivas em todos os registros de ínidices que a leitura encontra.INSERT INTO ... VALUES (...)
: atribui uma trava exclusiva em registros inseridos; note que está rava não é uma trava de chave seguinte e não previne que outros usuários insiram nas lacunas antes do registro inserido. Se um erro de chave duplicada ocorrerm, atribua uma trava compartilhada no registro de índice duplicado.INSERT INTO T SELECT ... FROM S WHERE ...
atribui uma trava exclusiva em cada linha inserida emT
. Faz a busca emS
como uma leitura consistente, mas configura travas de chave seguinte compartilhada emS
se o log do MariaDB estiver ligado. OInnoDB
tem que atribuir travas neste último caso porque em recuperações roll-forward de um backup, toda instrução SQL tem que ser executada exatamente da mesma forma que foi feito originalmente.CREATE TABLE ... SELECT ...
realiza oSELECT
como uma leitura consistente ou com travas compartilhadas, como no item anterior.REPLACE
é feita como uma inserção se não houver colisões em uma chave única. De outra forma, uma trava de chave seguinte exclusiva é colocada na linha que deve ser atualizada.UPDATE ... SET ... WHERE ...
: atribui trava de chave seguinte exclusiva em todos os registros que a busca encontrar.DELETE FROM ... WHERE ...
:atribui trava de chave seguinte exclusiva em todos os registros que a busca encontrar.- Se uma restrição
FOREIGN KEY
é definida na tabela. qualquer inserçao, atualização ou deleção que exige verificação da condição de restrição configura travas de registros compartilhados nos registros que que ele olha na verificação da restrição. Também no caso onde a restrição falha. oInnoDB
define estes bloqueios. LOCK TABLES ...
: atribui trava a tabela. Na implementação a camada MariaDB de código atribui este bloqueio. A detecção automatica de deadlocks doInnoDB
não pode ser feita onde tais travas de tabelas estão envolvidas: veja a seção seguinte. Também, uma vez que o MariaDB sabe sobre bloqueio de registros, é impossível que você obtenha um bloqueio em uma tabela na qual outro usuário tenha bloqueio de registro. Mas isto não coloca a integridade da transação em perigo. Leia "Restrições em Tabelas InnoDB".