


Problèmes de programmation et de traitement des transactions MySQL Innodb
1. Problèmes de soumission en boucles
De nombreux développeurs aiment soumettre des transactions en boucles. Voici un exemple de procédure stockée qu'ils écrivent souvent, comme indiqué ci-dessous :
DROP PROCEDURE IF EXISTS load1;CREATE PROCEDURE load1(count INT UNSIGNED)BEGIN DECLARE s INT UNSIGNED DEFAULT 1; DECLARE c CHAR(80) DEFAULT REPEAT('a',80); WHILE s <= count DO INSERT INTO t1 select NULL,c; COMMIT; SET s=s+1; END WHILE;END;
Dans l’exemple ci-dessus, l’ajout ou non de la commande commit n’est pas critique. Étant donné que le moteur de stockage de MySQL innodb utilise par défaut la soumission automatique, le résultat de la suppression du commit dans la procédure stockée est le même. Comme indiqué ci-dessous, voici un autre problème qui est facilement négligé par les développeurs :
DROP PROCEDURE IF EXISTS load2; CREATE PROCEDURE load2(count INT UNSIGNED)BEGIN DECLARE s INT UNSIGNED DEFAULT 1; DECLARE c CHAR(80) DEFAULT REPEAT('a',80); WHILE s <= count DO INSERT INTO t1 select NULL,c; SET s=s+1; END WHILE;END;
Quelle que soit la procédure stockée ci-dessus, lorsqu'une erreur se produit, la base de données restera à un emplacement inconnu. Par exemple, nous voulons insérer 10 000 éléments de données, mais une erreur s'est produite lors de l'insertion de 5 000 éléments. Cependant, ces 5 000 éléments ont été stockés dans la base de données. Comment devons-nous les gérer ? L'autre est un problème de performances. Les deux procédures stockées ci-dessus ne seront pas plus rapides que la procédure stockée ci-dessous, car la suivante met l'insertion dans une transaction :
DROP PROCEDURE IF EXISTS load3; CREATE PROCEDURE load3(count INT UNSIGNED)BEGIN DECLARE s INT UNSIGNED DEFAULT 1; DECLARE c CHAR(80) DEFAULT REPEAT('a',80); START TRANSACTION; WHILE s <= count DO INSERT INTO t1 select NULL,c; SET s=s+1; END WHILE; COMMIT;END;
Pour les trois stockages ci-dessus Dans le processus, nous insérons respectivement 1 million de données pour comparer le temps d'exécution, comme indiqué ci-dessous. On voit évidemment que la troisième méthode est beaucoup plus rapide car un journal redo doit être écrit pour chaque mention, donc Load1 et Load2 écrivent en fait 1 million. refaire les journaux. Pour la procédure stockée load3, nous n'avons écrit le journal de rétablissement qu'une seule fois.
Préparez d'abord une table de test
CREATE TABLE `t1` (`id` int NOT NULL AUTO_INCREMENT ,`name` varchar(500) NULL , PRIMARY KEY (`id`) ) ;
Exécutez le test
09:50:44 test> call load1(1000000); Query OK, 0 rows affected (1 min 4.90 sec)09:54:23 test> truncate table t1; Query OK, 0 rows affected (0.05 sec)09:54:25 test> call load2(1000000); Query OK, 1 row affected (1 min 3.38 sec)09:55:32 test> truncate table t1; Query OK, 0 rows affected (0.20 sec)09:55:58 test> call load3(1000000); Query OK, 0 rows affected (33.90 sec)
Pour le deuxième chargement de procédure stockée2, nous pouvons également ouvrir manuellement la transaction, la même chose peut être fait Pour obtenir l'effet de chargement de procédure stockée3, le temps d'exécution est le suivant :
09:57:42 test> begin; Query OK, 0 rows affected (0.00 sec)09:57:46 test> call load2(1000000); Query OK, 1 row affected (34.08 sec)09:58:26 test> commit; Query OK, 0 rows affected (0.76 sec)
2. À propos de l'utilisation de la soumission automatique
Dans certains scénarios particuliers, la soumission automatique n'est parfois pas nécessairement nécessaire. C'est une bonne chose., Comme nous l'avons mentionné ci-dessus à propos du problème de soumission circulaire, la base de données MySQL utilise par défaut la validation automatique (autocommit). Vous pouvez modifier la méthode de soumission MySQL des manières suivantes :
10:35:34 test> SET AUTOCOMMIT=0; Query OK, 0 rows affected (0.00 sec)
Vous pouvez également utiliser START TRANSATION ou BEGIN pour démarrer explicitement une transaction. MySQL exécutera automatiquement
SET AUTOCOMMIT=0 et exécutera SET AUTOCOMMIT=1 après que COMMIT ou ROLLBACK termine une transaction.
3. Utiliser la restauration automatique pour gérer les exceptions Que faire lorsqu'une exception se produit dans un processus stocké ? Le moteur de stockage Innodb prend en charge la restauration automatique des transactions via un HANDLER. Si une erreur se produit pendant le processus de stockage, l'opération de restauration sera automatiquement effectuée. A titre d'exemple ci-dessous :
CREATE PROCEDURE sp_auto_rollback_demo()BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; START TRANSACTION; INSERT INTO b select 1; INSERT INTO b select 2; INSERT INTO b select 1; INSERT INTO b select 3; COMMIT;END;
La table de test est la suivante
CREATE TABLE `b` ( `a` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Exécutez la procédure stockée ci-dessus, donc une erreur se produira lors de l'insertion du deuxième enregistrement 1, mais car automatique est activé Pour l'opération de rollback, le résultat de l'exécution de cette procédure stockée est le suivant :
10:09:46 test> call sp_auto_rollback_demo; Query OK, 0 rows affected (0.01 sec)10:10:04 test> select * from b;Empty set (0.00 sec)
Il semble qu'il n'y ait pas de problème et l'opération est relativement normale, mais lors de l'exécution de sp_auto_rollback_demo, l'exécution a-t-elle réussi ou échoué ? Nous pouvons gérer cela comme suit, l'exemple est le suivant :
DROP PROCEDURE IF EXISTS sp_auto_rollback_demo;CREATE PROCEDURE sp_auto_rollback_demo()BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT -1; END; START TRANSACTION; INSERT INTO b select 1; INSERT INTO b select 2; INSERT INTO b select 1; INSERT INTO b select 3; COMMIT; SELECT 1;END;
Lorsqu'une erreur se produit, revenez d'abord en arrière, puis renvoyez -1, indiquant qu'une erreur s'est produite pendant le fonctionnement. Le retour de 1 indique un fonctionnement normal. Les résultats en cours sont les suivants :
10:16:19 test> call sp_auto_rollback_demo\G*************************** 1. row ***************************-1: -1 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) 10:16:35 test> select * from b; Empty set (0.00 sec)
Ce qui précède est le contenu des problèmes de programmation et de traitement des transactions MySQL Innodb. Pour plus de contenu connexe, veuillez prêter attention au site Web PHP chinois (www.php.cn). !

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Dans la base de données MySQL, la relation entre l'utilisateur et la base de données est définie par les autorisations et les tables. L'utilisateur a un nom d'utilisateur et un mot de passe pour accéder à la base de données. Les autorisations sont accordées par la commande Grant, tandis que le tableau est créé par la commande Create Table. Pour établir une relation entre un utilisateur et une base de données, vous devez créer une base de données, créer un utilisateur, puis accorder des autorisations.

MySQL convient aux débutants car il est simple à installer, puissant et facile à gérer les données. 1. Installation et configuration simples, adaptées à une variété de systèmes d'exploitation. 2. Prise en charge des opérations de base telles que la création de bases de données et de tables, d'insertion, d'interrogation, de mise à jour et de suppression de données. 3. Fournir des fonctions avancées telles que les opérations de jointure et les sous-questionnaires. 4. Les performances peuvent être améliorées par l'indexation, l'optimisation des requêtes et le partitionnement de la table. 5. Prise en charge des mesures de sauvegarde, de récupération et de sécurité pour garantir la sécurité et la cohérence des données.

Navicat lui-même ne stocke pas le mot de passe de la base de données et ne peut récupérer que le mot de passe chiffré. Solution: 1. Vérifiez le gestionnaire de mots de passe; 2. Vérifiez la fonction "Remember Motway" de Navicat; 3. Réinitialisez le mot de passe de la base de données; 4. Contactez l'administrateur de la base de données.

1. Utilisez l'index correct pour accélérer la récupération des données en réduisant la quantité de données numérisées SELECT * FROMMLOYEESEESHWHERELAST_NAME = 'SMITH'; Si vous recherchez plusieurs fois une colonne d'une table, créez un index pour cette colonne. If you or your app needs data from multiple columns according to the criteria, create a composite index 2. Avoid select * only those required columns, if you select all unwanted columns, this will only consume more server memory and cause the server to slow down at high load or frequency times For example, your table contains columns such as created_at and updated_at and timestamps, and then avoid selecting * because they do not require inefficient query se

Créez une base de données à l'aide de NAVICAT Premium: Connectez-vous au serveur de base de données et entrez les paramètres de connexion. Cliquez avec le bouton droit sur le serveur et sélectionnez Créer une base de données. Entrez le nom de la nouvelle base de données et le jeu de caractères spécifié et la collation. Connectez-vous à la nouvelle base de données et créez le tableau dans le navigateur d'objet. Cliquez avec le bouton droit sur le tableau et sélectionnez Insérer des données pour insérer les données.

NAVICAT pour MARIADB ne peut pas afficher directement le mot de passe de la base de données car le mot de passe est stocké sous forme cryptée. Pour garantir la sécurité de la base de données, il existe trois façons de réinitialiser votre mot de passe: réinitialisez votre mot de passe via Navicat et définissez un mot de passe complexe. Affichez le fichier de configuration (non recommandé, haut risque). Utilisez des outils de ligne de commande système (non recommandés, vous devez être compétent dans les outils de ligne de commande).

La copie d'une table dans MySQL nécessite la création de nouvelles tables, l'insertion de données, la définition de clés étrangères, la copie des index, les déclencheurs, les procédures stockées et les fonctions. Les étapes spécifiques incluent: la création d'une nouvelle table avec la même structure. Insérez les données de la table d'origine dans une nouvelle table. Définissez la même contrainte de clé étrangère (si le tableau d'origine en a un). Créer le même index. Créez le même déclencheur (si le tableau d'origine en a un). Créez la même procédure ou fonction stockée (si la table d'origine est utilisée).

Affichez la base de données MySQL avec la commande suivante: Connectez-vous au serveur: MySQL -U Username -P mot de passe Exécuter les bases de données Afficher les bases de données; Commande pour obtenir toutes les bases de données existantes Sélectionnez la base de données: utilisez le nom de la base de données; Tableau de vue: afficher des tables; Afficher la structure de la table: décrire le nom du tableau; Afficher les données: sélectionnez * dans le nom du tableau;
