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 :)