{"meta":{"title":"Correction des interblocages de base de données ou des problèmes d’intégrité des données","intro":"Copilot Chat peut vous aider à éviter le code qui provoque des opérations de base de données lentes ou bloquées, ou des tables avec des données manquantes ou incorrectes.","product":"GitHub Copilot","breadcrumbs":[{"href":"/fr/enterprise-cloud@latest/copilot","title":"GitHub Copilot"},{"href":"/fr/enterprise-cloud@latest/copilot/tutorials","title":"Tutoriels"},{"href":"/fr/enterprise-cloud@latest/copilot/tutorials/copilot-cookbook","title":"livre de recettes GitHub Copilot"},{"href":"/fr/enterprise-cloud@latest/copilot/tutorials/copilot-cookbook/refactor-code","title":"Refactoriser le code"},{"href":"/fr/enterprise-cloud@latest/copilot/tutorials/copilot-cookbook/refactor-code/fix-database-deadlocks","title":"Corriger les interblocages de base de données"}],"documentType":"article"},"body":"# Correction des interblocages de base de données ou des problèmes d’intégrité des données\n\nCopilot Chat peut vous aider à éviter le code qui provoque des opérations de base de données lentes ou bloquées, ou des tables avec des données manquantes ou incorrectes.\n\nLes opérations complexes sur les bases de données, en particulier celles qui impliquent des transactions, peuvent entraîner des interblocages ou des incohérences de données difficiles à déboguer.\n\nCopilot Chat peut vous aider à identifier les points dans une transaction où un verrouillage ou des interblocages peuvent se produire, et peut suggérer de bonnes pratiques pour l’isolation des transactions ou la résolution des interblocages, comme l’ajustement des stratégies de verrouillage ou le traitement approprié des exceptions d’interblocage.\n\n> \\[!NOTE] Les réponses décrites dans cet article sont des exemples.\n> Copilot Chat les réponses ne sont pas déterministes. Vous pouvez donc obtenir des réponses différentes des réponses présentées ici.\n\n## Éviter les mises à jour simultanées sur des lignes interdépendantes\n\nLorsque deux transactions ou plus tentent de mettre à jour les mêmes lignes d’une table de base de données, mais dans des ordres différents, cela peut entraîner une condition d’attente circulaire.\n\n### Exemple de scénario\n\nL’extrait SQL suivant met à jour une ligne d’une table, puis effectue une opération qui prend plusieurs secondes, avant de mettre à jour une autre ligne de la même table. Cela pose un problème car la transaction verrouille la ligne `id = 1` pendant plusieurs secondes avant que la transaction ne s’achève, libérant ainsi le verrou. Si une autre transaction démarre pendant ce temps et effectue une opération similaire, mais verrouille d’abord la ligne `id = 2` afin de pouvoir la mettre à jour, puis tente de verrouiller la ligne `id = 1`, les deux transactions devront attendre que l’autre se termine, ce qui entraînera un interblocage.\n\n```sql id=deadlock-example\nBEGIN TRANSACTION;\nUPDATE my_table SET value = 'Some value' WHERE id = 301;\n-- Simulate a process taking 5 seconds:\nWAITFOR DELAY '00:00:05';\nUPDATE my_table SET value = 'Another value' WHERE id = 127;\nCOMMIT TRANSACTION;\n```\n\n### Exemple d'invite 1\n\nVous pouvez vérifier s’il y a des problèmes avec cette transaction.\n\nDans l’éditeur, sélectionnez le code de transaction, puis demandez Copilot Chat:\n\n```copilot copy prompt ref=deadlock-example\nIs this transaction good?\n```\n\n### Exemple de réponse 1\n\nCopilot indique que « la transaction dans votre code SQL est généralement correcte », mais répertorie certaines choses à prendre en compte : durée de verrouillage, gestion des erreurs et concurrence. Il est mentionné que « la transaction conserve les verrous pendant une période prolongée, ce qui peut entraîner des blocages ou des interblocages ». La réponse comprend également un code révisé qui ajoute la gestion des erreurs.\n\nDans ce cas, vous décidez de ne pas ajouter la gestion des erreurs. Pour l’instant, vous souhaitez traiter le risque potentiel de blocages (deadlocks).\n\n### Exemples d’invite 2\n\nEntrez cette instruction de suivi :\n\n```copilot copy prompt ref=deadlock-example\nHow can I rewrite this code to reduce the chance of deadlock to a minimum while not adversely affecting performance. Tell me anything else I can do to avoid a deadlock. Note: I don't want to add error handling at this time.\n```\n\n### Exemple de réponse 2\n\nCopilot donne les conseils suivants :\n\n> *\n\n**Ordre d’accès :** Vérifiez que toutes les transactions accèdent aux tables et aux lignes dans le même ordre.\n\n> \\*\n> **Maintenir des transactions courtes :** réduisez au minimum la durée pendant laquelle une transaction détient des verrous.\n> \\*\n> **Utiliser des niveaux d’isolation appropriés :** utilisez le niveau d’isolation le plus bas qui réponde à vos besoins.\n>\n> Voici une version révisée de votre code :\n\n```sql\nBEGIN TRANSACTION;\n-- Update the rows in a consistent order\nUPDATE my_table SET value = 'Another value' WHERE id = 127;\nUPDATE my_table SET value = 'Some value' WHERE id = 301;\n-- Simulate a process taking 5 seconds:\nWAITFOR DELAY '00:00:05';\nCOMMIT TRANSACTION;\n```\n\n## Éviter les recherches non indexées\n\nLa recherche de colonnes de table qui n’ont pas été indexées entraîne généralement un balayage complet de la table. Cette opération peut être très lente et gourmande en ressources, augmentant ainsi la probabilité de goulots d’étranglement des performances.\n\n### Exemple de scénario\n\nLe langage SQL suivant entraînera un balayage complet de la table si `some_column` n’est pas indexé :\n\n```sql id=full-table-scan\nBEGIN TRANSACTION;\nSELECT * FROM my_table WHERE some_column = 'some_value';\n-- More actions here, then:\nCOMMIT TRANSACTION;\n```\n\n### Exemple d’invite\n\nPoser Copilot la question suivante révèle généralement le problème potentiel.\n\n```copilot copy prompt ref=full-table-scan\nHow can I optimize this transaction?\n```\n\n### Exemple de réponse\n\nCopilot donne quelques conseils et mentionne que la colonne doit être indexée :\n\n> Pour optimiser la transaction, vous devez vous assurer qu’elle est aussi courte que possible afin de réduire les verrouillages et d’améliorer les performances. Voici quelques conseils :\n>\n> 1.\n\n**Réduire au minimum le travail effectué dans la transaction :** n’incluez que les opérations nécessaires dans la transaction.\n\n> 1\\.\n> **Utiliser les index appropriés :** assurez-vous que les colonnes utilisées dans la clause WHERE sont indexées.\n> 1\\.\n> **Éviter les transactions longues :** la durée de la transaction doit être courte pour éviter les problèmes de verrouillage.\n\nLe code suggéré dans la réponse comprend la commande SQL pour l’indexation de la colonne :\n\n```sql\n`CREATE INDEX idx_some_column ON my_table(some_column);`\n```\n\n## Éviter les transactions longues\n\nIl est important d’éviter, dans la mesure du possible, les requêtes et les transactions longues, car elles peuvent fortement dégrader les performances et provoquer des goulets d’étranglement pour d’autres opérations. De plus, elles peuvent consommer beaucoup de mémoire et d’espace de journal, ce qui rend votre application plus vulnérable aux défaillances dans les environnements à forte charge.\n\n### Exemple de scénario\n\nLe code SQL suivant crée de nouvelles lignes dans `target_table`, contenant des données provenant de champs sélectionnés de lignes dans `source_table` lorsque diverses conditions sont remplies. Si `source_table` est très volumineux, la transaction risque d’être longue.\n\n```sql id=long-running-transaction\nBEGIN TRANSACTION;\n\nINSERT INTO target_table (first_name, last_name, email, dept, role, hire_date)\nSELECT first_name, last_name, email, department, job_title, start_date\nFROM source_table\nWHERE (department = 'Engineering' AND (salary > 95000 OR grade > 5))\n  OR (department = 'Marketing' AND performance_rating = 'Excellent');\n\nCOMMIT;\n```\n\n### Exemple d’invite\n\nVous pouvez demander à Copilot s’il est possible d’éviter les transactions de longue durée.\n\n```copilot copy prompt ref=long-running-transaction\nsource_table is an extremely large table. Without altering the table, how can I ensure this SQL doesn't become a long-running query, that blocks other operations?\n```\n\n### Exemple de réponse\n\nCopilot suggère les stratégies suivantes :\n\n* **Traitement par lots :** traiter les données par petits lots au lieu d’une seule grande transaction. Cette opération peut être réalisée à l’aide d’une boucle avec une limite et un décalage.\n* **Indexation :** assurez-vous que les colonnes utilisées dans la clause `WHERE` (`department`, `salary`, `grade` et `performance_rating`) sont indexées pour accélérer la requête.\n* **Verrouillage :** utilisez le verrouillage au niveau de la ligne pour éviter de verrouiller l’ensemble de la table.\n\nIl fournit l’exemple suivant de la manière dont vous pouvez mettre en œuvre le traitement par lots. Ce langage SQL traite les données par lots de 1 000 lignes à la fois, ce qui réduit la charge de la base de données et empêche les transactions longues.\n\n```sql\nDECLARE @BatchSize INT = 1000;\nDECLARE @Offset INT = 0;\nDECLARE @RowCount INT;\n\nSET @RowCount = @BatchSize;\n\nWHILE @RowCount = @BatchSize\nBEGIN\n    BEGIN TRANSACTION;\n\n    INSERT INTO target_table (first_name, last_name, email, dept, role, hire_date)\n    SELECT first_name, last_name, email, department, job_title, start_date\n    FROM source_table\n    WHERE (department = 'Engineering' AND salary > 95000)\n       OR (department = 'Engineering' AND years_of_experience > 5)\n       OR (department = 'Marketing' AND performance_rating = 'Excellent');\n    ORDER BY primary_key_column\n    OFFSET @Offset ROWS FETCH NEXT @BatchSize ROWS ONLY;\n\n    SET @RowCount = @@ROWCOUNT;\n    SET @Offset = @Offset + @BatchSize;\n\n    COMMIT;\nEND;\n```\n\nCopilot vous indique de remplacer `primary_key_column` dans le code suggéré par le nom de la colonne clé primaire réelle de `source_table`.\n\n## Éviter les problèmes d’intégrité des données\n\nIl est important que les informations figurant dans vos bases de données restent exactes, cohérentes et complètes. Des requêtes mal conçues peuvent entraîner des données manquantes ou incorrectes.\n\n### Exemple de scénario\n\nLa transaction SQL suivante supprime un enregistrement d’employé et crée un journal de suppression. Toutefois, il est possible que l’opération `DELETE` réussisse et que l’opération `INSERT` échoue, auquel cas il n’y a pas d’enregistrement de journal pour la suppression.\n\n```sql id=delete-employee\nBEGIN TRANSACTION;\n\nDELETE FROM employees\nWHERE employee_id = 101;\n\nINSERT INTO deletion_log (employee_id, deletion_date, reason)\nVALUES (101, GETDATE(), 'Voluntary Resignation');\n\nCOMMIT TRANSACTION;\n```\n\n### Exemple d’invite\n\n```copilot copy prompt ref=delete-employee\nHow can I ensure that the DELETE and INSERT operations are only performed if both succeed?\n```\n\n### Exemple de réponse\n\nCopilot vous indique que vous obtenez cette opération à l’aide d’une transaction avec gestion des erreurs. Il fournit l'exemple suivant utilisant la construction `TRY...CATCH` de SQL Server :\n\n```sql\nBEGIN TRY\n    BEGIN TRANSACTION;\n\n    DELETE FROM employees\n    WHERE employee_id = 101;\n\n    INSERT INTO deletion_log (employee_id, deletion_date, reason)\n    VALUES (101, GETDATE(), 'Voluntary Resignation');\n\n    COMMIT TRANSACTION;\nEND TRY\nBEGIN CATCH\n    ROLLBACK TRANSACTION;\n    -- Handle the error, e.g., log it or re-throw\n    DECLARE @ErrorMessage NVARCHAR(4000);\n    DECLARE @ErrorSeverity INT;\n    DECLARE @ErrorState INT;\n\n    SELECT\n        @ErrorMessage = ERROR_MESSAGE(),\n        @ErrorSeverity = ERROR_SEVERITY(),\n        @ErrorState = ERROR_STATE();\n\n    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);\nEND CATCH;\n```\n\nLe code suggéré garantit que si l’opération `DELETE` ou `INSERT` échoue, la transaction est annulée et aucune modification n’est apportée à la base de données.\n\n## Lectures complémentaires\n\n* [Ingénierie rapide pour GitHub Copilot Chat](/fr/enterprise-cloud@latest/copilot/concepts/prompting/prompt-engineering)\n* [Meilleures pratiques pour l’utilisation de GitHub Copilot](/fr/enterprise-cloud@latest/copilot/get-started/best-practices)"}