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

Validation et transaction MySQL

Dans InnoDB, vous n'avez pas besoin de démarrer ou de terminer explicitement des transactions pour des requêtes uniques si vous n'avez pas modifié le paramètre par défaut d'autocommit, qui est "on". Si la validation automatique est activée, InnoDB inclut automatiquement chaque requête SQL dans une transaction, ce qui équivaut à START TRANSACTION; query; COMMIT; .

Si vous utilisez explicitement START TRANSACTION dans InnoDB avec autocommit activé, puis toutes les requêtes exécutées après un START TRANSACTION seront toutes exécutées ou toutes échoueront. Ceci est utile dans les environnements bancaires, par exemple :si je transfère 500 $ sur votre compte bancaire, cette opération ne devrait réussir que si la somme a été soustraite de mon solde bancaire et ajoutée au vôtre. Donc, dans ce cas, vous exécuteriez quelque chose comme

START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;

Cela garantit que les deux requêtes s'exécuteront avec succès, ou aucune, mais pas une seule. Ce message a un peu plus sur le moment où vous devez utiliser les transactions.

Dans InnoDB, vous devrez très rarement verrouiller des tables entières ; InnoDB, contrairement à MyISAM, prend en charge le verrouillage au niveau des lignes. Cela signifie que les clients n'ont pas à verrouiller toute la table, ce qui oblige les autres clients à attendre. Les clients ne doivent verrouiller que les lignes dont ils ont réellement besoin, permettant aux autres clients de continuer à accéder aux lignes dont ils ont besoin.

Vous pouvez en savoir plus sur les transactions InnoDB ici . Vos questions sur l'interblocage trouvent une réponse dans les sections 14.2.8.8 et 14.2.8.9 des docs. Si une requête échoue, votre pilote MySQL renverra un message d'erreur indiquant la raison ; votre application doit alors réémettre les requêtes si nécessaire.

Enfin, dans votre exemple de code, vous avez utilisé mysql_query . Si vous écrivez un nouveau code, veuillez cesser d'utiliser l'ancien mysql_, lent et obsolète bibliothèque pour PHP et utilisez mysqli_ ou AOP à la place :)