Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Comportamento de 'selecionar para atualização' do MySQL


Deixe-me ver seus casos e explicar como esses bloqueios funcionam:

1 caso

T1 deseja atualizar algumas linhas em sua tabela de teste. Esta transação coloca o bloqueio IX em todas as tabelas e o bloqueio X nas primeiras 5 linhas.

T2 deseja atualizar algumas linhas em sua tabela de teste. Esta transação coloca IX (porque IX compatível com IX) trava em toda a tabela e tenta as primeiras 5 linhas mas não consegue porque X não é compatível com X

Então estamos bem.

caso 2.1

T1 deseja atualizar algumas linhas em sua tabela de teste. Esta transação colocou o IX lock em toda a tabela e o X lock nas primeiras 5 linhas.

T2 deseja selecionar algumas linhas da sua tabela de teste. E não coloca nenhum bloqueio (porque o InnoDB fornece leituras sem bloqueio)

caso 2.1

T1 deseja atualizar algumas linhas em sua tabela de teste. Esta transação colocou o IX lock em toda a tabela e o X lock nas primeiras 5 linhas.

T2 deseja atualizar (selecionar para atualização) algumas linhas de sua tabela de teste. Coloca IS em toda a tabela e tenta obter o bloqueio S na linha e falha porque X e S são incompatíveis.

Também esteja sempre ciente do nível de isolamento:níveis diferentes causam mecanismos diferentes para liberar/adquirir bloqueios

Espero que ajude