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.
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) }
J'ai essayé d'encapsuler l'appel save() dans une transaction mais cela n'a pas aidé.
Maintenant, j'ai les questions suivantes :
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.
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!