Compreensão e aprendizado de transações mysql, o princípio da indexação é o princípio da transação

contente

Compreensão transacional

composição da transação

Características da transação

Declarações de controle para transações comuns

Características ACID das transações

Atomicidade (entender onde os dados globais podem ser gravados com a ajuda de multithreading) Unidade de operação de ligação

isolamento

Persistência (gravar o log primeiro e depois gravar no disco, eficiente)

Consistência (é um estado em que a integridade dos dados não é destruída, seja revertida ou confirmada)

Exceção de simultaneidade transacional

leitura suja

 Leitura não repetível (ler + ler, o resultado é diferente)

Leitura fantasma (ler + escrever, pensar que leu, ir escrever, mas não existe)

Nível de isolamento da transação

Conhecimento simples dos níveis de isolamento

A implementação subjacente do nível de isolamento (mvcc + vários bloqueios) mvcc + vários bloqueios são para garantir o isolamento, atomicidade e outras propriedades entre transações em execução simultânea

pequeno resumo


Compreensão transacional

composição da transação

  • Em termos simples, uma transação pode consistir em uma instrução sql simples ou um conjunto de instruções sql complexas ( uma transação é uma unidade lógica de programa )

Características da transação

  • Quando o banco de dados confirma uma transação, todas as modificações são salvas ou todas as modificações são descartadas   ( atômica, toda a transação é concluída ou toda a transação é descartada )
  • Uma transação é uma unidade de execução de programa que acessa e atualiza vários itens de dados em um banco de dados
  • O mecanismo innodb do mysql suporta transações, myisam não suporta transações , e cada instrução sql no innodb é uma transação; se quisermos cancelar a transação de confirmação automática, podemos definir a sessão atual para confirmar manualmente a transação definindo set autocommit = 0;

Declarações de controle para transações comuns

-- 显示的开启事务
start transaction | begin;

-- 提交事务,并且对于当前数据库所作的操作修改做持久化
commit;

-- 回滚事务,结束用户的事务,并撤销正在进行的所有未提交的修改
rollback;

-- 创建一个保存点,一个事务可以有多个保存点
savepoint identifier

-- 删除一个保存点
release savepoint identifier

-- 事务回滚到保存点
rollback to [savepoint] identifier

Características ACID das transações

Atomicity   (compreensão de onde os dados globais podem ser gravados com a ajuda de multi-threading)  unidade de operação de ligação

  • Compreensão superficial: Isso é fácil de entender, o que significa que uma transação deve ser uma unidade de sequência de operação atômica e todas as operações podem permitir apenas dois estados em um processo de execução -    todas as execuções são bem-sucedidas ou todas as execuções falham    ( vinculadas em uma transação todas as operações em
  • Entendimento aprofundado: as operações de transação são feitas (commit) ou não feitas (rollback) ; uma transação é uma unidade de execução de programa que acessa e atualiza vários itens de dados no banco de dados e é uma unidade de trabalho inseparável ; o rollback é obtido por meio de undolog operar. O undolog registra a operação específica de cada etapa da transação. Quando é revertido, a operação inversa da operação específica da transação é reproduzida ; (o princípio do rollback é seguir o undolog de volta para restaurar o estado anterior ao Operação)

isolamento

  • A execução de uma transação não pode ser interferida por outras transações.
  • Para explicar o isolamento: Primeiro entenda a simultaneidade das transações.Existem muitos usuários do nosso banco de dados, e as transações podem ser executadas simultaneamente.Isolamento significa que as transações simultâneas são isoladas umas das outras e não interferem umas nas outras . Ou seja, quando diferentes transações operam os mesmos dados simultaneamente, cada transação possui seu próprio espaço de dados independente e completo.
  • Compreensão aprofundada do princípio: O isolamento das transações requer que os objetos de cada transação de leitura/gravação possam ser separados dos objetos de operação de outras transações , ou seja, eles não são visíveis para outras transações antes que a transação seja confirmada ; é realizado por meio de MVCC e bloqueios; MVCC é o controle simultâneo de várias versões , que resolve principalmente leituras consistentes sem bloqueio , alcança um desempenho eficiente de leitura simultânea gravando e obtendo versões de linha em vez de usar bloqueios para limitar as operações de leitura. Os bloqueios são usados ​​para lidar com operações DML simultâneas ; o banco de dados fornece estratégias de bloqueio granular para três bloqueios de granularidade: tabela (índice clusterizado B+ árvore), página (índice clusterizado B+ nó folha) e linha (um segmento de linha de registro em um nó folha) .

  •  O MVCC tem melhor desempenho, evita adicionar operações de leitura de bloqueio de linha e evita espera de bloqueio

Persistência (gravar o log primeiro e depois gravar no disco, eficiente)

  • Depois que a transação é confirmada, suas alterações nos dados são persistentes. Uma vez que a transação é confirmada, os dados relacionados devem mudar de um estado livre ou transitório para um estado persistente.
  • redo log é um módulo de log específico para o mecanismo InnoDB, que registra: quais alterações foram feitas em uma página de dados;
  • Quando o MySQL executa uma instrução de atualização, o mecanismo InnoDB primeiro grava o registro no arquivo de redo log e atualiza a memória. Neste ponto, a operação de atualização está concluída, mas não há disco para persistir a atualização de dados. O mecanismo InnoDB persistirá a operação de atualização de dados no disco em um momento adequado.
  • Depois que a transação for confirmada, a operação DML da transação será persistente (qual valor de deslocamento de página do arquivo de disco redolog é gravado nos dados específicos); mesmo se ocorrer uma falha, como tempo de inatividade, o banco de dados pode recuperar os dados. O redo log registra o log físico ; ( significando que todas as operações DML da transação serão gravadas no arquivo de disco do redo log, e a localização e as operações específicas da operação serão registradas no redo log log, portanto, mesmo que haja um tempo de inatividade, etc. também recuperável )

Consistência (é um estado em que a integridade dos dados não é destruída, seja revertida ou confirmada)

  • Refere-se à necessidade de manter a integridade e consistência dos dados antes e depois da operação do banco de dados. A execução da transação faz com que o banco de dados seja convertido de um estado de consistência para outro estado de consistência , ou seja, antes e depois do transação é executada, as restrições de integridade do banco de dados não são destruídas. (por exemplo: A conta A transfere 500 yuans para a conta B, é impossível dizer que a conta A diminuiu 500 yuans, mas a conta B não aumentou 500 yuans )
  • A consistência é mantida pela atomicidade, isolamento e durabilidade.

Exceção de simultaneidade transacional

leitura suja

  • A transação A pode ler dados que ainda não foram confirmados por outra transação B. Os dados não confirmados lidos pela transação A são os chamados dados de leitura suja . Para demonstrar a leitura de dados de leitura suja, primeiro precisamos definir o nível de isolamento para ler não confirmado leia sem compromisso
  • Demonstrar leituras sujas

 Leitura não repetível (ler + ler, o resultado é diferente)

  • A transação (A) pode ler os dados enviados em outra transação (B); geralmente acontece que os dados lidos duas vezes em uma transação não são os mesmos;  existem leituras não repetíveis no nível de isolamento READ COMMITTED . De um modo geral, o problema de leitura não repetível é aceitável, pois a leitura dos dados enviados geralmente não causa grandes problemas, portanto, o nível de isolamento padrão de muitos fabricantes (como Oracle, SQL Server) é READ COMMITTED
  • A transação A é lida pela primeira vez, a transação B ainda não foi confirmada, a transação A é lida pela segunda vez, a transação B é confirmada e os resultados das duas leituras não serão consistentes

Leitura fantasma (ler + escrever, pensar que leu, ir escrever, mas não existe)

  • Uma operação de leitura em uma transação não pode suportar a próxima lógica de negócios; geralmente ocorre quando uma operação de leitura em uma transação determina que a próxima operação de gravação falha ; por exemplo: uma tabela com nome como a chave exclusiva, query select * from t where name em uma transação = 'marca'; não existe, então insira em t(nome) valores ('marca'); ocorre um erro e outra transação também executa uma operação de inserção; leitura fantasma existe em nível de isolamento leitura repetível e abaixo; mas pode ser resolvido lendo bloqueios (usando bloqueios compartilhados) no nível de leitura repetível ;
  • Um exemplo simples de leitura fantasma é que a transação A acabou de consultar um registro que não existe e se prepara para fazer uma operação de inserção. Neste momento, outra transação B insere esse registro e o envia. Neste momento, é equivalente para a consulta de registro agora. ilusório, não real, também conhecido como leitura fantasma 

  • Solução 1: Adicione um bloqueio de leitura compartilhado, um bloqueio de leitura e um bloqueio de intervalo à operação de consulta. Após o bloqueio, outras transações não podem ser alinhadas para operações de inserção. Quando um bloqueio compartilhado é adicionado à consulta, a transação B não pode concluir a operação de inserção. , para evitar o fenômeno da leitura fantasma ( o bloqueio compartilhado no mysql é equivalente ao bloqueio de gravação quando aprendemos o sistema operacional )
  • Solução 2: Modifique diretamente o nível de isolamento da transação para ler sequencialmente: serializável, a operação de leitura adicionará automaticamente o compartilhamento de bloqueio compartilhado no modo após a serialização , mas basicamente não é recomendado, a eficiência é muito baixa, o bloqueio aguarda, e o desempenho diminui terrivelmente.

Nível de isolamento da transação

  • Conhecimento simples dos níveis de isolamento

  •  Quanto maior o nível de isolamento da transação, mais seguro será, mas a eficiência se tornará cada vez menor, e a simultaneidade se tornará cada vez pior
  • O nível padrão geralmente é leitura confirmada ou leitura repetível
  • Os padrões ISO e ANIS SQL formularam quatro padrões de nível de isolamento de transação.Cada fabricante de banco de dados fez compromissos entre correção e desempenho, e não seguiu estritamente esses padrões; o nível de isolamento suportado pelo MySQL innodb por padrão é REPEATABLE READ ;     

  • A implementação subjacente do nível de isolamento (mvcc + vários bloqueios) mvcc + vários bloqueios são para garantir o isolamento, atomicidade e outras propriedades entre transações em execução simultânea

  • READ UNCOMMITTED leitura não confirmada; leitura não está bloqueada neste nível, bloqueio exclusivo de gravação, bloqueio de gravação é liberado após confirmação ou reversão da transação        ( leitura não confirmada, leitura neste nível não será bloqueada e não há mvcc )
  • READ COMMITTED A leitura foi confirmada; a leitura neste nível não será bloqueada automaticamente, mas mvcc (controle de simultaneidade de várias versões) é adotado, que é fornecer uma leitura consistente sem bloqueio, e a   operação de leitura lê dados históricos de instantâneos em desta vez; este isolamento Os dados mais recentes da versão histórica são lidos sob o nível, então os dados enviados são lidos;       ( É justamente porque os dados mais recentes da versão histórica, ou seja, os dados enviados atualmente, são lidos, então leitura repetida não é suportada, porque existem outros A transação faz um novo envio, e o resultado da leitura repetida da transação será inconsistente com o anterior ao envio )

  • REPEATABLE READ Leitura repetível; MVCC também é suportado neste nível, e a operação de leitura lê os dados da versão no início da transação
  • Ou seja, como a leitura repetível suporta leitura repetível, não importa quantas novas versões você envie, eu sempre leio apenas a primeira versão da transação aberta, ou seja, minha primeira versão de dados históricos, a versão mais recente do instantâneo histórico dados enviados por outras transações eu não vou prestar atenção. (       Como eu tenho lido a primeira versão dos dados, naturalmente isso não causará o problema de inconsistência de dados repetidos devido à versão mais recente dos dados. Esta é uma leitura repetível, então agora eu entendo por que ele pode suportar a leitura repetida de dados consistentes      )
  • SERIALIZABLE pode ser serializado; neste nível, um bloqueio compartilhado (bloqueio S) é adicionado à leitura; portanto, as transações são executadas em série; o nível de isolamento é o mais rigoroso no momento ;

pequeno resumo

  • Em primeiro lugar, este capítulo aprende principalmente a definição de transações, entende a natureza importante das transações e inicialmente entende por que lock + mvcc suporta operações de execução de várias transações simultâneas   (e entende a implementação subjacente de vários níveis de isolamento)
  • O que é uma transação: uma instrução SQL simples ou uma coleção de várias instruções SQL complexas
  • Quais propriedades as transações precisam garantir:  
  • Atomicidade: A operação de reversão do log de desfazer garante que todas as instruções SQL sejam executadas com êxito ou todas tenham falhado. 
  • Isolamento: mvcc + lock garante que cada transação das operações de leitura e escrita seja isolada uma da outra e não interfira entre si.A operação de escrita deve ser adicionada com x lock, e a operação de leitura é dividida em versões.
  • ler não confirmado não bloqueará nem mvcc   
  • leitura confirmada Há controle de simultaneidade de várias versões do mvcc, leitura fantasma pode ocorrer, pode ser evitada pelo bloqueio compartilhado s, leia a versão mais recente dos dados, há um problema de leitura não repetível,                  
  •  A leitura repetível lê a versão mais antiga dos dados para evitar o problema de inconsistência de dados repetidos, mas a leitura fantasma também pode ocorrer, a solução é adicionar s bloqueio compartilhado
  • serializável: leitura sequencial, bloqueio s automático para operação de leitura, absolutamente seguro, mas a simultaneidade é a pior    
  • Persistência: use o redo log para suportar a persistência, modifique o endereço físico dos dados do mysql + como modificar o registro do log, mesmo que esteja inativo, você pode usar o redo log log para recuperação
  • Consistência: Garanta a integridade dos dados antes e depois da transação e converta de um estado de consistência para outro estado de consistência. A garantia de consistência depende das três propriedades acima
  • read commitado Ler a versão mais recente dos dados terá o problema de leitura não repetível   ( os dados lidos são os resultados diferentes antes e depois do commit de outras transações )
  • leitura repetível: leitura repetível, leia a primeira versão dos dados históricos do instantâneo, para evitar resultados inconsistentes de leitura repetida, mas pode haver um fenômeno de leitura fantasma, leitura fantasma, leitura + gravação e operação de atualização de acordo com o resultado da leitura. Pergunta, acabei de ler, outras transações foram atualizadas + confirmadas. Neste momento, o resultado da seleção anterior já está incorreto, e os dados lidos antes são os dados de leitura fantasma    ( como evitar, mais o s lock )

Deixe um post, uma explicação detalhada de vários bloqueios no mysql, bloqueios ----" Transações são muito importantes

Acho que você gosta

Origin blog.csdn.net/weixin_53695360/article/details/124026899
Recomendado
Clasificación