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

Commit e transação do MySQL


No InnoDB, você não precisa iniciar ou encerrar explicitamente as transações para consultas únicas se não tiver alterado a configuração padrão do autocommit, que é "on". Se o autocommit estiver ativado, o InnoDB incluirá automaticamente cada consulta SQL em uma transação, que é o equivalente a START TRANSACTION; query; COMMIT; .

Se você usar explicitamente START TRANSACTION no InnoDB com autocommit ativado, então quaisquer consultas executadas após um START TRANSACTION instrução serão todos executados ou todos eles falharão. Isso é útil em ambientes bancários, por exemplo:se estou transferindo $ 500 para sua conta bancária, essa operação só deve ser bem-sucedida se a soma tiver sido subtraída do meu saldo bancário e adicionada ao seu. Então, neste caso, você executaria algo como
START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;

Isso garante que ambas as consultas sejam executadas com êxito, ou nenhuma, mas não apenas uma. Esta postagem tem um pouco mais sobre quando você deve usar transações.

No InnoDB, você raramente terá que bloquear tabelas inteiras; O InnoDB, ao contrário do MyISAM, suporta bloqueio em nível de linha. Isso significa que os clientes não precisam bloquear a tabela inteira, forçando outros clientes a esperar. Os clientes devem bloquear apenas as linhas de que realmente precisam, permitindo que outros clientes continuem acessando as linhas de que precisam.

Você pode ler mais sobre transações InnoDB aqui . Suas perguntas sobre impasse são respondidas nas seções 14.2.8.8 e 14.2.8.9 dos docs. Se uma consulta falhar, seu driver MySQL retornará uma mensagem de erro indicando o motivo; seu aplicativo deve reemitir as consultas, se necessário.

Finalmente, em seu código de exemplo, você usou mysql_query . Se você estiver escrevendo um novo código, pare de usar o antigo, lento e obsoleto mysql_ biblioteca para PHP e use mysqli_ ou DOP em vez disso :)