Maison > développement back-end > Golang > le corps du texte

Les écritures simultanées MySQL et GORM provoquent des erreurs

WBOY
Libérer: 2024-02-09 10:30:18
avant
486 Les gens l'ont consulté

Les écritures simultanées MySQL et GORM provoquent des erreurs

Le problème d'écriture simultanée entre MySQL et GORM a toujours été un casse-tête pour les développeurs. Dans des situations de concurrence élevée, plusieurs threads écrivant simultanément dans la base de données peuvent entraîner une incohérence des données ou des résultats erronés. L'éditeur PHP Baicao analysera pour vous les causes et les solutions de ce problème afin de vous aider à éviter les problèmes causés par l'écriture simultanée. Grâce à une conception et une optimisation raisonnables, le problème d'écriture simultanée de MySQL et GORM peut être résolu efficacement pour garantir la cohérence et l'exactitude des données.

Contenu de la question

J'ai implémenté un script d'importation CSV complexe dans Golang. J'utilise l'implémentation du pool de travail. Dans ce pool de travailleurs, les travailleurs exécutent 1 000 petits fichiers CSV qui catégorisent, étiquetent et marquent les produits. Ils écrivent tous dans la même table de base de données. Jusqu'ici, tout va bien.

Le problème auquel je suis confronté est que si je sélectionne plus de 2 travailleurs, le processus plante de manière aléatoire avec le message suivant

Le flux de travail est

foreach (csv) {
 workerPool.submit(csv)
}

func worker(csv) {
 foreach (line) {
   import(line)
 }
}

import(line) {
 product = get(line)
 product.category = determine_category(product)
 product.brand = determine_brand(product)
 save(brand)
 product.tags = determine_tags(product)
 //and after all
 save(product)
}
Copier après la connexion

J'ai essayé d'encapsuler l'appel save() dans une transaction mais cela n'a pas aidé.

Maintenant, j'ai les questions suivantes :

  1. Mysql est-il adapté pour enregistrer sur 1 table en même temps ?
  2. Si une transaction est nécessaire pour accomplir cette tâche, où doit-elle être définie ?
  3. Le pilote go sql (l'erreur se produit toujours dans packet.go:1102) est-il adapté pour faire cela ?
  4. Quelqu'un peut-il m'aider (peut-être embaucher quelques heures) ?

Je suis totalement coincé. Je peux également partager le code source si cela peut aider. Mais je veux d’abord savoir si vous pensez qu’il s’agit de mon code ou d’un problème général.

Solution de contournement

Ouvrez une nouvelle connexion à la base de données dans chaque goroutine (ou thread, pour les langages qui utilisent des threads).

Le protocole MySQL est avec état, ce qui signifie que si plusieurs goroutines tentent d'utiliser la même connexion, les requêtes et les réponses peuvent devenir très déroutantes.

Vous rencontrerez également le même problème lorsque vous tenterez de partager tout autre type de connexion de protocole avec état entre des goroutines.

Par exemple, FTP est également un protocole avec état, qui peut être plus facile à comprendre. La goroutine client peut envoyer un message du type "Obtenir le fichier x" et la réponse doit être une série de messages contenant le contenu du fichier. Si une autre goroutine essaie d'utiliser la même connexion pendant que la requête/réponse est en cours, les deux clients seront confus. La deuxième goroutine lira les paquets appartenant à un fichier qu'elle n'a pas demandé. La première goroutine à demander le fichier constatera que certains des paquets attendus ont été lus.

De même, le protocole MySQL ne prend pas en charge plusieurs goroutines client partageant une seule connexion.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal