Je n'ai vraiment pas trouvé d'exemple normal de fichier PHP où les transactions MySQL sont utilisées. Pouvez-vous me montrer un exemple simple de cela?
Et encore une question. J'ai déjà fait beaucoup de programmation et n'ai pas utilisé de transactions. Puis-je mettre une fonction PHP ou quelque chose dans header.php
ce cas si l'un mysql_query
échoue, les autres échouent aussi?
Je pense que je l'ai compris, est-ce vrai?:
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
Bonsoir
la source
la source
mysql_query("BEGIN");
place de la séquencemysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
mysql_*
fonctions dans le nouveau code . Ils ne sont plus entretenus et sont officiellement obsolètes . Vous voyez la boîte rouge ? Découvrezplutôt les instructions préparées et utilisez PDO ou MySQLi - cet article vous aidera à décider lesquelles. Si vous choisissez PDO, voici un bon tutoriel .mysql
wun die malgré sa dépréciation, il sera disponible dans PECL pour toujours.mysql
Réponses:
L'idée que j'utilise généralement lorsque je travaille avec des transactions ressemble à ceci (semi-pseudo-code) :
Notez qu'avec cette idée, si une requête échoue, une exception doit être levée:
PDO::setAttribute
PDO::ATTR_ERRMODE
etPDO::ERRMODE_EXCEPTION
Malheureusement, il n'y a pas de magie impliquée. Vous ne pouvez pas simplement placer une instruction quelque part et effectuer des transactions automatiquement: vous devez encore spécifier quel groupe de requêtes doit être exécuté dans une transaction.
Par exemple, très souvent, vous aurez quelques requêtes avant la transaction (avant le
begin
) et un autre couple de requêtes après la transaction (après oucommit
ourollback
) et vous voudrez que ces requêtes soient exécutées, peu importe ce qui s'est passé (ou non) dans la transaction.la source
$db
type ici? mysqli?PDOException
et même vérifier les valeurs d'exception si nécessaire. us2.php.net/PDOExceptionJe pense que je l'ai compris, est-ce vrai?:
la source
la source
Comme c'est le premier résultat sur google pour "php mysql transaction", j'ai pensé ajouter une réponse qui montre explicitement comment faire cela avec mysqli (comme l'auteur original voulait des exemples). Voici un exemple simplifié de transactions avec PHP / mysqli:
Gardez également à l'esprit que PHP 5.5 a une nouvelle méthode mysqli :: begin_transaction . Cependant, cela n'a pas encore été documenté par l'équipe PHP, et je suis toujours bloqué en PHP 5.3, donc je ne peux pas en parler.
la source
$conn->autocommit(FALSE)
, dans l'exemple ci-dessus, n'affecte que la connexion individuelle - il n'a aucun effet sur les autres connexions à la base de données.if (!result)
, devrait le faireif (result === false)
, si la requête est capable de renvoyer un résultat valide qui serait évalué à faux ou à zéro.Veuillez vérifier le moteur de stockage que vous utilisez. S'il s'agit de MyISAM, alors
Transaction('COMMIT','ROLLBACK')
il ne sera pas pris en charge car seul le moteur de stockage InnoDB, et non MyISAM, prend en charge les transactions.la source
Lors de l'utilisation d'une connexion PDO:
J'utilise souvent le code suivant pour la gestion des transactions:
Exemple d'utilisation:
De cette façon, le code de gestion des transactions n'est pas dupliqué dans le projet. Ce qui est une bonne chose, car, à en juger par les autres réponses PDO de ce fil, il est facile de s'y tromper. Les plus courants oublient de relancer l'exception et démarrent la transaction à l'intérieur du
try
bloc.la source
J'ai fait une fonction pour obtenir un vecteur de requêtes et faire une transaction, peut-être que quelqu'un le trouvera utile:
la source
J'ai eu cela, mais je ne sais pas si c'est correct. Pourrait également essayer cela.
Idée d'ici: http://www.phpknowhow.com/mysql/transactions/
la source
mysql_query
, au lieu d'utilisermysqli
, même si vous liez à un didacticiel qui utilisemysqli
. À mon humble avis, vous devez soit supprimer ce mauvais exemple, soit le remplacer pour utiliser le code tel qu'écrit dans le tutoriel phpknowhow.Un autre exemple de style procédural avec
mysqli_multi_query
, suppose que$query
est rempli d'instructions séparées par des points-virgules.la source
mysqli_multi_query
. Toute personne intéressée par cela devrait google ailleurs pour un exemple plus propre.