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

Manipulando transações no MySQL


O MySQL fornece vários mecanismos de banco de dados para lidar com as consultas SQL. Os motores mais populares são MyISAM e InnoDB. Fora desses dois mecanismos, o InnoDB suporta transações, o que significa que podemos confirmar e reverter para executar uma operação envolvendo várias consultas como uma única unidade. O mesmo não é possível com o MyISAM, pois não suporta transações. O InnoDB é mais confiável em comparação ao MyISAM, pois usa logs transacionais para recuperação automática.



Observações :O MySQL está planejando remover completamente o MyISAM, pois o InnoDB é muito melhor em desempenho em comparação com o MyISAM.



Este tutorial fornece os detalhes para lidar com transações no MySQL usando START TRANSACTION, COMMIT e ROLLBACK declarações. Embora possamos executar as consultas SQL separadamente, que é o cenário ideal, em vários casos precisamos ter certeza de que todas as consultas específicas de uma tarefa devem ser bem-sucedidas ou falhar devido à falha de qualquer uma das consultas. Podemos considerar essas tarefas como uma única unidade envolvendo várias operações ou consultas para criar, atualizar ou excluir linhas. Portanto, em uma unidade transacional com várias operações, ela deve ser bem-sucedida ou falhar.



Deve-se tomar cuidado ao lidar com transações, pois existem certas instruções que não podem ser revertidas. Isso inclui banco de dados CREATE/DROP, tabela CREATE/ALTER/DROP ou rotinas armazenadas.


Propriedades de uma Transação




Abaixo estão listadas as quatro propriedades padrão de uma transação. Eles também são chamados de ACID .



Atomicidade - Garante que todas as operações envolvidas em uma tarefa ou unidade sejam concluídas com sucesso. Em caso de falha de qualquer uma das operações, a transação deve ser abortada e todas as operações anteriores devem ser revertidas ao seu estado anterior. Isso significa que em caso de falha de uma transação, nenhuma das operações envolvidas deve ser bem-sucedida.



Consistência - Os dados devem estar em um estado consistente no início e no final da transação para garantir que o banco de dados altere os estados para refletir as alterações em uma transação confirmada com êxito.



Isolamento - A transação deve ser concluída de forma isolada ocultando os estados intermediários com outras transações. Cada transação deve operar de forma independente e transparente entre si.



Durabilidade - Garante que as alterações nos dados como parte de uma transação persistem mesmo em caso de falha do sistema. As alterações não devem ser desfeitas mesmo em caso de falha do sistema.


Declarações de transação




INICIAR TRANSAÇÃO - Podemos usar INICIAR TRANSAÇÃO ou INICIAR ou COMEÇAR A TRABALHAR para iniciar a transação. O INÍCIO ou COMEÇAR A TRABALHAR são os aliases de INICIAR TRANSAÇÃO.



COMPROMISSO - Em caso de sucesso, o COMMIT O comando deve ser emitido no final da transação para persistir as alterações.



ROLLBACK - Em caso de falha, o ROLLBACK comando deve ser emitido para restaurar os estados como se antes de iniciar a transação.



DEFINIR AUTOCOMMIT - Use a instrução SET AUTOCOMMIT para desabilitar o auto-commit no início da transação e habilitá-lo no final da transação. Use apenas no caso de INICIAR TRANSAÇÃO ou INICIAR ou COMEÇAR A TRABALHAR não são usados ​​para lidar com a transação.


Exemplo de transferência de dinheiro




Vou explicar a transação usando o exemplo de transferência de dinheiro intrabancária em que uma certa quantia de dinheiro deve ser transferida de uma conta para outra conta dentro do mesmo banco.



Observações :Este exemplo é apenas para fins de demonstração e o cenário real definitivamente será diferente com base nas regras bancárias. Ele também assume que as consultas transacionais são manipuladas programaticamente e os valores intermediários são armazenados em variáveis ​​apropriadas.



A sequência de operações para realizar a transferência é a seguinte:


  • Obtenha os IDs de cliente de débito e crédito da solicitação e armazene em variáveis.
  • Obtenha o valor a ser transferido da solicitação e armazene em uma variável.
  • Inicie a transação.
  • Obtenha o saldo do primeiro cliente e armazene em uma variável.
  • Obtenha o saldo do segundo cliente e armazene em uma variável.
  • Reverta a transação caso o primeiro cliente tenha saldo insuficiente.
  • Adicione uma transação de débito para refletir a dedução da primeira conta do cliente.
  • Reversão em caso de falha.
  • Adicione uma transação de crédito para refletir a transferência para a segunda conta do cliente.
  • Reversão em caso de falha.
  • Grave a transferência.
  • Reversão em caso de falha.
  • Atualize o saldo do primeiro cliente.
  • Reversão em caso de falha.
  • Atualize o saldo do segundo cliente.
  • Reversão em caso de falha.
  • Confirme a transação.



Abaixo mencionadas são as consultas de amostra para executar a sequência de transferência.


-- Start the transaction
START TRANSACTION;

-- Get balance of first customer
SELECT balance from ACCOUNT WHERE customer_id = 123124123;

-- Get balance of second customer
SELECT balance from ACCOUNT WHERE customer_id = 223124145;

-- Rollback in case of insufficient funds
ROLLBACK;

-- Add debit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(123124123, <amount>, 0, <reference>);

-- Rollback in case of failure
ROLLBACK;

-- Add credit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(223124145, <amount>, 1, <reference>);

-- Rollback in case of failure
ROLLBACK;

-- Add transfer transaction
INSERT INTO transfer(from,to,amount) VALUES(123124123, 223124145, <amount>);

-- Rollback in case of failure
ROLLBACK;

-- Update balance of first customer
UPDATE ACCOUNT SET balance = <balance - amount> WHERE customer_id = 123124123;

-- Rollback in case of failure
ROLLBACK;

-- Update balance of second customer
UPDATE ACCOUNT SET balance = <balance + amount> WHERE customer_id = 223124145;

-- Rollback in case of failure
ROLLBACK;

-- Commit the transaction
COMMIT;



Podemos ver claramente que devemos reverter em caso de falha em qualquer estágio para retornar aos estados iniciais antes de iniciar a transferência para refletir o saldo real de ambos os clientes.



É assim que podemos lidar com as transações no MySQL.