English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
O MySQL é usado principalmente para processar dados com grande volume e alta complexidade. Por exemplo, em um sistema de gestão de pessoal, ao excluir um membro, você precisa excluir não apenas as informações básicas do membro, mas também as informações relacionadas ao membro, como caixa de e-mail, artigos etc., então essas instruções de operação de banco de dados formam uma transação!
No MySQL, apenas os bancos de dados ou tabelas que usam o mecanismo de banco de dados Innodb suportam transações.
O processamento de transações pode ser usado para manter a integridade do banco de dados, garantindo que os lotes de instruções SQL sejam executados ou não executados integralmente.
A transação é usada para gerenciar instruções insert,update,delete
Em geral, uma transação deve atender4um dos critérios (ACID)::: Atomicidade (Atomicidade, também chamada de indivisibilidade), consistência (Consistency), isolamento (Isolation, também conhecido como independência), persistência (Durabilidade).
Atomicidade:Todas as operações de uma transação (transaction) devem ser concluídas ou não concluídas, nunca parar no meio de algum processo. Se ocorrer um erro durante a execução da transação, ela será revertida (Rollback) ao estado antes da transação, como se a transação nunca tivesse sido executada.
Consistência:Antes do início da transação e após o término da transação, a integridade do banco de dados não é quebrada. Isso significa que os dados escritos devem atender completamente a todas as regras pré-definidas, incluindo a precisão, a consistência e a capacidade do banco de dados de concluir automaticamente o trabalho planejado.
Isolação:A capacidade do banco de dados de permitir que várias transações concorrentes realizem leituras e modificações em seus dados ao mesmo tempo, a isolação pode evitar que várias transações executem de forma concorrente, resultando em inconsistências de dados devido à execução cruzada. A isolação de transação é dividida em diferentes níveis, incluindo Read uncommitted (Read não confirmado), Read committed (Read confirmado), Repeatable read (Leitura repetível) e Serializable (Serializável).
Permanência:Após o processamento da transação, as modificações nos dados são permanentes, mesmo que ocorra falha no sistema, não serão perdidas.
Pelo padrão, no comando de linha do MySQL, as transações são automaticamente submetidas, ou seja, após a execução da instrução SQL, será executada imediatamente a operação COMMIT. Portanto, para abrir explicitamente uma transação, é necessário usar o comando BEGIN ou START TRANSACTION, ou executar o comando SET AUTOCOMMIT=0 para proibir o uso do commit automático da sessão atual.
BEGIN ou START TRANSACTION abre explicitamente uma transação;
COMMIT também pode ser usado COMMIT WORK, mas ambos são equivalentes. O COMMIT submete a transação e faz com que todas as modificações feitas no banco de dados se tornem permanentes;
ROLLBACK também pode ser usado ROLLBACK WORK, mas ambos são equivalentes. O rollback termina a transação do usuário e anula todas as modificações não submetidas em andamento;
SAVEPOINT identifier, o SAVEPOINT permite criar um ponto de salvamento dentro da transação, uma transação pode ter vários SAVEPOINT;
RELEASE SAVEPOINT identifier remove um ponto de salvamento da transação, quando não é especificado um ponto de salvamento, a execução da instrução lançará uma exceção;
ROLLBACK TO identifier faz rollback da transação para o ponto de marcação;
SET TRANSACTION é usado para definir o nível de isolamento da transação. O mecanismo de armazenamento InnoDB fornece níveis de isolamento de transação, incluindo READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ e SERIALIZABLE.
1Usando BEGIN, ROLLBACK e COMMIT para implementar
BEGIN Iniciar uma transação
ROLLBACK Rollback de transação
COMMIT Confirmação de transação
2e diretamente usar SET para alterar o modo de submissão automática do MySQL:
SET AUTOCOMMIT=0 Desativar submissão automática
SET AUTOCOMMIT=1 Ativar submissão automática
mysql> use w3codebox; Banco de dados alterado mysql> CREATE TABLE w3codebox_transaction_test(id int(5)) engine=innodb; # Criação da tabela de dados Query OK, 0 linhas afetadas (0.04 sec) mysql> select * from w3codebox_transaction_test; Conjunto vazio (0.01 sec) mysql> begin; # Início da transação Query OK, 0 linhas afetadas (0.00 sec) mysql> insert into w3codebox_transaction_test value(5); Query OK, 1 linhas afetadas (0.01 sec) mysql> insert into w3codebox_transaction_test value(6); Query OK, 1 linhas afetadas (0.00 sec) mysql> commit; # Submissão da transação Query OK, 0 linhas afetadas (0.01 sec) mysql> select * from w3codebox_transaction_test; +------+ | id | +------+ | 5 | | 6 | +------+ 2 linhas no conjunto (0.01 sec) mysql> begin; # Início da transação Query OK, 0 linhas afetadas (0.00 sec) mysql> insert into w3codebox_transaction_test values(7); Query OK, 1 linhas afetadas (0.00 sec) mysql> rollback; # Rollback Query OK, 0 linhas afetadas (0.00 sec) mysql> select * from w3codebox_transaction_test; # Por causa do rollback, os dados não foram inseridos +------+ | id | +------+ | 5 | | 6 | +------+ 2 linhas no conjunto (0.01 sec) mysql>
<?php $dbhost = 'localhost'; // Endereço do servidor do MySQL $dbuser = 'root'; // Nome de usuário do MySQL $dbpass = '123456'; // Nome de usuário e senha do MySQL $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Falha de conexão: ' . mysqli_error($conn)); } // Definir codificação, evitar caracteres chineses ilegíveis mysqli_query($conn, "set names utf8); mysqli_select_db( $conn, 'w3codebox' ); mysqli_query($conn, "SET AUTOCOMMIT=0"); // Definir como não autoenvio, pois o MYSQL default é executar imediatamente mysqli_begin_transaction($conn); // Definição de início de transação if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(8)") { mysqli_query($conn, "ROLLBACK"); // Rollback ao falhar na execução } if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(9)") { mysqli_query($conn, "ROLLBACK"); // Rollback ao falhar na execução } mysqli_commit($conn); //Executar transação mysqli_close($conn); ?>