Os conceitos e características das transações do banco de dados MySQL e a sintaxe e o processo de execução de transações no MySQL

Conceitos e características de transação de banco de dados

Uma transação de banco de dados é um mecanismo, uma sequência de operação e inclui um conjunto de comandos de operação de banco de dados. Uma transação submete ou revoga uma solicitação de operação ao sistema junto com todos os comandos como um todo, ou seja, esse conjunto de comandos do banco de dados é executado ou não executado, portanto a transação é uma unidade lógica de trabalho indivisível.

Ao realizar operações simultâneas em um sistema de banco de dados, as transações são usadas como a menor unidade de controle, o que é especialmente adequado para sistemas de banco de dados operados por vários usuários ao mesmo tempo. Por exemplo, sistemas de reserva de companhias aéreas, bancos, companhias de seguros e sistemas de negociação de títulos.

As transações têm quatro características, nomeadamente atomicidade, consistência, isolamento e durabilidade.Essas quatro características são geralmente chamadas de ACID.

1. Atomicidade

Uma transação é uma operação completa. Os elementos de uma transação são indivisíveis (atômicos). Todos os elementos da transação devem ser confirmados ou revertidos como um todo. Se algum elemento da transação falhar, toda a transação falhará.

Tomando como exemplo a operação de transferência bancária, se a operação for submetida, os dados das duas contas serão atualizados. Se por algum motivo a transação terminar antes da atualização bem-sucedida de ambas as contas, os saldos de ambas as contas não serão atualizados, as modificações em quaisquer saldos de contas serão desfeitas e a transação não poderá ser parcialmente confirmada.

2. Consistência

Quando a transação for concluída, os dados deverão estar em um estado consistente. Ou seja, os dados armazenados no banco de dados estão em um estado consistente antes do início da transação. Durante uma transação em andamento, os dados podem estar em um estado inconsistente, por exemplo, os dados podem ser parcialmente modificados. No entanto, quando a transação for concluída com êxito, os dados deverão retornar novamente a um estado consistente conhecido. As modificações feitas nos dados através de transações não podem danificar os dados, ou as transações não podem deixar o armazenamento de dados num estado instável.

Tomemos como exemplo a transação de transferência bancária. Antes do início da transação, o total de todos os saldos das contas está em um estado consistente. Durante o curso da transação, o saldo de uma conta é reduzido, enquanto o saldo da outra conta não foi modificado. Portanto, o total de todos os saldos de contas é inconsistente. Depois que a transação for concluída, o saldo total da conta será restaurado novamente para um estado consistente.

3. Isolamento

Todas as transações simultâneas que modificam dados são isoladas umas das outras, o que significa que as transações devem ser independentes e não devem depender ou afetar outras transações de forma alguma. Uma transação que modifica dados pode acessá-los antes do início de outra transação que usa os mesmos dados ou após o término de outra transação que usa os mesmos dados.

Além disso, quando uma transação modifica dados, se qualquer outro processo estiver usando os mesmos dados ao mesmo tempo, as modificações nos dados não terão efeito até que a transação seja confirmada com sucesso. A transferência entre Zhang San e Li Si e a transferência entre Wang Wu e Zhao Er são sempre independentes uma da outra.

4. Durabilidade

A durabilidade da transação significa que, independentemente de o sistema falhar, os resultados do processamento da transação são permanentes.

Depois que uma transação é concluída com êxito, as alterações feitas no banco de dados são permanentes, mesmo se o sistema falhar. Ou seja, uma vez confirmada a transação, quaisquer alterações feitas nos dados pela transação serão retidas permanentemente no banco de dados.

O princípio ACID de transações garante que uma transação seja confirmada com êxito ou falhe e seja revertida, ou um dos dois. Portanto, suas modificações na transação são recuperáveis. Ou seja, quando uma transação falha, suas modificações nos dados serão restauradas ao estado anterior à execução da transação.

Sintaxe e processo de execução de transação MySQL

MySQL fornece vários mecanismos de armazenamento para suportar transações. Os mecanismos de armazenamento que suportam transações incluem InnoDB e BDB. As transações do mecanismo de armazenamento InnoDB são implementadas principalmente por meio de logs UNDO e REDO. O mecanismo de armazenamento MyISAM não oferece suporte a transações.

Expansão: Qualquer tipo de banco de dados terá vários logs para registrar o status de execução, operações diárias, mensagens de erro, etc. do banco de dados, e o MySQL não é exceção. Por exemplo, quando o usuário root faz login no servidor MySQL, o tempo de login do usuário, as operações de execução, etc. serão registrados no arquivo de log.

Para manter o servidor MySQL, muitas vezes é necessário realizar operações de log no banco de dados MySQL:

  • Log UNDO: Copia os dados antes da transação ser executada e é usado para reverter os dados quando ocorre uma exceção na transação.
  • Log REDO: registra todas as operações que atualizam dados durante a execução da transação. Quando a transação é confirmada, o conteúdo será liberado para o disco.

Prática completa de habilidades básicas de banco de dados MySQL icon-default.png?t=N7T8https://edu.csdn.net/course/detail/36210
Nas configurações padrão, cada instrução SQL é uma transação, ou seja, é enviada automaticamente após a execução da instrução SQL. Para combinar várias operações como um todo, você precisa usar BEGIN ou START TRANSACTION para iniciar uma transação ou desabilitar o envio automático da sessão atual.

Para obter informações sobre o envio automático de transações, você pode ler a seção  " MySQL Setting Automatic Transaction Submission ".

Sintaxe e processo para execução de transações

SQL usa as instruções a seguir para gerenciar transações.

1) Iniciar transação
BEGIN;

 ou

START TRANSACTION;

Esta declaração marca explicitamente o ponto de partida de uma transação.

2) Enviar transação

MySQL usa a seguinte instrução para confirmar uma transação:

COMMIT;

COMMIT significa confirmar uma transação, ou seja, confirmar todas as operações da transação. Especificamente, todas as atualizações do banco de dados na transação são gravadas no banco de dados físico no disco e a transação termina normalmente.

Confirmar uma transação significa que todos os dados executados desde o início da transação serão modificados e se tornarão parte permanente do banco de dados, marcando também o fim de uma transação. Depois que este comando for executado, a transação não poderá ser revertida. Esta operação é executada somente quando todas as modificações estão prontas para serem confirmadas no banco de dados.

3) Transação de reversão (desfazer)

MySQL reverte a transação usando a seguinte instrução:

ROLLBACK;

ROLLBACK significa cancelar a transação, ou seja, ocorre algum tipo de falha durante a execução da transação e a transação não pode continuar a ser executada. O sistema irá desfazer todas as operações concluídas no banco de dados na transação e reverter para o estado inicial da transação. A operação aqui refere-se à operação de atualização no banco de dados.

Quando um erro for encontrado durante a execução da transação, use a instrução ROLLBACK para reverter a transação para o ponto inicial ou para um ponto de espera especificado. Ao mesmo tempo, o sistema limpará todas as modificações de dados feitas desde o ponto inicial da transação ou até um determinado ponto de salvamento e liberará os recursos controlados pela transação. Portanto, esta declaração também marca o fim da transação.

Resumir

As operações de atualização dos dados do banco de dados pelas instruções SQL após a instrução BEGIN ou START TRANSACTION serão registradas no log de transações até que a instrução ROLLBACK ou COMMIT seja encontrada. Se uma operação na transação falhar e uma instrução ROLLBACK for executada, todos os dados atualizados após a abertura da instrução da transação poderão ser revertidos para o estado anterior ao início da transação. Se todas as operações na transação forem concluídas corretamente e a instrução COMMIT for usada para enviar dados atualizados ao banco de dados, os dados neste momento estarão em um novo estado consistente.

Demonstração de exemplo

Abaixo estão dois exemplos para demonstrar o uso específico de transações MySQL.

Exemplo 1

A seguir, simula-se o cenário em que outras sessões acessam a tabela de dados depois que a conta de Zhang San diminui em 500 yuans, mas a conta de Li Si não aumenta em 500 yuans. Como o código precisa ser executado em duas janelas, para facilitar a leitura, chamamos aqui de janela A e janela B.

1) Abra uma transação na janela A e atualize os dados da tabela bancária no banco de dados mybank. A instrução SQL e os resultados da execução são os seguintes:

mysql> USE mybank;
Database changed
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE bank SET currentMoney = currentMoney-500
    -> WHERE customerName='张三';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

2) Consulte os dados na tabela de dados bancários na janela B. A instrução SQL e os resultados da execução são os seguintes:

mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |      1000.00 |
| 李四         |         1.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

Pode-se observar pelos resultados que embora a transação na janela A tenha alterado os dados da tabela do banco, os dados não são atualizados imediatamente, neste momento, outras sessões ainda leem os dados antes da atualização.

3) Continue a executar a transação na janela A e envie a transação. A instrução SQL e os resultados da execução são os seguintes:

mysql> UPDATE bank SET currentMoney = currentMoney+500
    -> WHERE customerName='李四';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> COMMIT;
Query OK, 0 rows affected (0.07 sec)

4) Consulte novamente os dados da tabela de dados bancários na janela B. A instrução SQL e os resultados da execução são os seguintes:

mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |       500.00 |
| 李四         |       501.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

Após executar COMMIT para confirmar a transação na janela A, as atualizações dos dados serão enviadas juntas e outras sessões lerão os dados atualizados. Pode-se observar pelos resultados que o saldo total da conta de Zhang San e Li Si permanece consistente com aquele antes da transferência, de modo que os dados são atualizados de um estado de consistência para outro.

Conforme mencionado anteriormente, quando ocorre um problema durante a execução da transação, ou seja, quando uma transação completa não pode ser executada de acordo com o processo normal, você pode usar a instrução ROLLBACK para reverter e usar os dados para restaurar o estado inicial.

No Exemplo 1, o saldo da conta de Zhang San foi reduzido para 500 yuans. Se outros 1.000 yuans forem transferidos, o saldo será negativo, por isso precisa ser revertido ao estado original. Como mostrado no Exemplo 2.

Exemplo 2

Reduza o saldo da conta de Zhang San em 1.000 yuans e reverta a transação.A instrução SQL e os resultados da execução são os seguintes:

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
 
mysql> UPDATE bank SET currentMoney = currentMoney-1000 WHERE customerName='张三';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0
 
mysql> ROLLBACK;
Query OK, 0 rows affected (0.07 sec)
 
mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |       500.00 |
| 李四         |       501.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

Pode-se observar pelos resultados que após a execução da reversão da transação, os dados da conta são restaurados ao estado inicial, ou seja, o estado anterior à execução da transação.

expandir

Nas operações de banco de dados, para garantir efetivamente a exatidão dos dados lidos simultaneamente, é proposto o nível de isolamento das transações. Nas demonstrações do Exemplo 1 e do Exemplo 2, o nível de isolamento da transação é o nível de isolamento padrão. No MySQL, o nível de isolamento padrão de uma transação é o nível de isolamento REPEATABLE-READ (relegível), ou seja, quando a transação não é finalizada (COMMIT ou ROLLBACK não é executado), outras sessões só podem ler dados não confirmados.

Clique em Níveis de isolamento de transação MySQL para saber mais.

Precauções

A transação MySQL é uma função que consome muitos recursos. Você deve prestar atenção aos seguintes pontos ao usá-la.

1) Mantenha as transações o mais curtas possível

Do início ao fim de uma transação, uma grande quantidade de recursos será reservada no sistema de gerenciamento de banco de dados para garantir a atomicidade, consistência, isolamento e durabilidade da transação. Se estiver em um sistema multiusuário, grandes transações ocuparão uma grande quantidade de recursos do sistema, sobrecarregando o sistema, afetando o desempenho do software e até mesmo travando o sistema.

2) A quantidade de dados acessados ​​na transação deve ser minimizada.

Quando as transações são executadas simultaneamente, quanto menor a quantidade de dados em que a transação opera, menos operações nos mesmos dados entre as transações.

3) Tente não usar transações ao consultar dados

Navegar e consultar dados não atualizará os dados no banco de dados, portanto, você deve tentar não usar transações para consultar dados para evitar a ocupação excessiva de recursos do sistema.

4) Tente não esperar pela entrada do usuário durante o processamento da transação.

Durante o processamento da transação, se você precisar esperar que o usuário insira os dados, a transação ocupará recursos por muito tempo e poderá causar congestionamento no sistema.

Treinamento prático de banco de dados mysql para engenheiro sênior de banco de dados Dachang icon-default.png?t=N7T8https://edu.csdn.net/course/detail/39021 

Acho que você gosta

Origin blog.csdn.net/m0_37449634/article/details/135554108
Recomendado
Clasificación