Eu realmente não encontrei um exemplo normal de arquivo PHP em que transações do MySQL estão sendo usadas. Você pode me mostrar um exemplo simples disso?
E mais uma pergunta. Eu já fiz muita programação e não usei transações. Posso colocar uma função PHP ou algo header.php
que, se um mysql_query
falhar, os outros falham também?
Eu acho que descobri isso, certo ?:
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");
if ($a1 and $a2) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
}
php
mysql
transactions
boa noite
fonte
fonte
mysql_query("BEGIN");
em vez de seqüênciamysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
mysql_*
funções no novo código . Eles não são mais mantidos e são oficialmente descontinuados . Veja a caixa vermelha ? Aprenda sobre as instruções preparadas e use o DOP ou o MySQLi - este artigo o ajudará a decidir quais. Se você escolher a DOP, aqui está um bom tutorial .mysql
wun die apesar de ter sido preterido, estará disponível no PECL para sempre.mysql
Respostas:
A ideia que geralmente uso ao trabalhar com transações se parece com isso (semi-pseudo-código) :
Observe que, com essa ideia, se uma consulta falhar, uma exceção deve ser lançada:
PDO::setAttribute
PDO::ATTR_ERRMODE
ePDO::ERRMODE_EXCEPTION
Infelizmente, não há mágica envolvida. Você não pode simplesmente colocar uma instrução em algum lugar e realizar transações automaticamente: você ainda precisa especificar qual grupo de consultas deve ser executado em uma transação.
Por exemplo, muitas vezes você terá algumas consultas antes da transação (antes da
begin
) e outras após a transação (apóscommit
ourollback
) ou deseja que essas consultas sejam executadas, independentemente do que aconteceu (ou não) em a transação.fonte
$db
tipo aqui? mysqli?PDOException
e até verificar valores de exceção, se necessário. us2.php.net/PDOExceptionEu acho que descobri isso, certo ?:
fonte
fonte
Como este é o primeiro resultado no google para "transação php mysql", pensei em adicionar uma resposta que demonstre explicitamente como fazer isso com o mysqli (como o autor original queria exemplos). Aqui está um exemplo simplificado de transações com PHP / mysqli:
Além disso, lembre-se de que o PHP 5.5 possui um novo método mysqli :: begin_transaction . No entanto, isso ainda não foi documentado pela equipe do PHP, e ainda estou preso no PHP 5.3, por isso não posso comentar.
fonte
$conn->autocommit(FALSE)
, no exemplo acima, está afetando apenas a conexão individual - não tem efeito em nenhuma outra conexão com o banco de dados.if (!result)
, deve funcionarif (result === false)
, se a consulta for capaz de retornar um resultado válido que seria avaliado como falso ou zero.Verifique qual mecanismo de armazenamento você está usando. Se for MyISAM,
Transaction('COMMIT','ROLLBACK')
não será suportado porque apenas o mecanismo de armazenamento InnoDB, não MyISAM, suporta transações.fonte
Ao usar a conexão PDO:
Costumo usar o seguinte código para gerenciamento de transações:
Exemplo de uso:
Dessa forma, o código de gerenciamento de transações não é duplicado no projeto. O que é uma coisa boa, porque, a julgar por outras respostas com DOP neste tópico, é fácil cometer erros. Os mais comuns são esquecer de repetir a exceção e iniciar a transação dentro do
try
bloco.fonte
Eu criei uma função para obter um vetor de consultas e fazer uma transação, talvez alguém ache útil:
fonte
Eu tinha isso, mas não tenho certeza se isso está correto. Poderia tentar isso também.
Idéia daqui: http://www.phpknowhow.com/mysql/transactions/
fonte
mysql_query
, em vez de usá-lomysqli
, mesmo que esteja vinculado a um tutorial usadomysqli
. IMHO, você deve excluir este exemplo ruim ou substituí-lo para usar o código conforme escrito no tutorial do phpknowhow.Mais um exemplo de estilo de procedimento com
mysqli_multi_query
, assume que$query
é preenchido com instruções separadas por ponto e vírgula.fonte
mysqli_multi_query
. Qualquer pessoa interessada nisso deve procurar no Google em outro lugar para obter um exemplo mais limpo.