Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL InnoDB - Confus à propos des transactions

Si le problème est quelque chose comme "Cette insertion a violé une clé unique ", le commit aura lieu. Vous devez vérifier vous-même si la requête a retourné des erreurs, et si c'est le cas, ROLLBACK .

Si le problème est par exemple un arrêt inattendu du serveur, les requêtes 1 et 2 n'auront pas lieu.

Bien sûr, puisque vos 3 requêtes ici sont les mêmes, c'est un exemple idiot. Changez au moins le lid à voir. Pourquoi ne pas faire un test rapide ?

Modifier :vous avez modifié votre question sur l'objet des transactions.

Le but des transactions est en effet de maintenir la base de données dans un état cohérent (lire sur ACID ), mais c'est au programmeur de décider ce qui est cohérent. Regardez la réponse de prodigitalson pour voir un exemple d'un possible php-way de capture d'erreur qui le fait pour vous. Mais pendant que vous êtes dans une transaction, les autres processus ne verront pas les changements que votre transaction effectue - donc atomiques et isolés.

CREATE TABLE `testkeys` (
  `lid` INT,
  `column_name` VARCHAR(50),
  UNIQUE KEY `testuniq` (`lid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

BEGIN;
INSERT INTO testkeys(lid,column_name) VALUES(1,'test 1');
INSERT INTO testkeys(lid,column_name) VALUES(2,'test 2');
INSERT INTO testkeys(lid,column_name) VALUES(3,'test 3');
INSERT INTO testkeys(lid,column_name) VALUES(2,'test 2b');
COMMIT;