Bonjour à vous ! Je ne sais pas dans quelle catégorie placer ce post. Donc libre à un admin de le déplacer s'il juge que la rubrique n'est pas la bonne (et désolé du désagrément !)
Je travaille sur un projet qui traite de plusieurs bases de données qui sont synchronisés.
Nous venons de remarquer que dès qu'on exécute une requête sur une tablequi est verrouillée par un script de synchro entrainait sistématiquement un crash.
Vous pouvez reproduire ce cas en créant une table sur un petit projet, faites un BEGIN TRAN depuis SQL Management Studio sur cette table, essayé d'exécuter un update via EF sur cette table : cela crash.
Je voulais savoir si certains avaient déjà réfléchis à ce problème et élaboré des solutions pour profiter de vos pistes et vos recherches. Je ne sais pas encore vers quelle mécanisme me tourner ni comment structurer le tout.
L'architecture de ce projet est la suivante (en light) : une appli Silverlight, une couche WCF qui permet de faire des appels à des méthodes qui travaillent sur l'EDM.
Le problème est que la synchro peut durer 1 seconde comme elle peut durer 1 min ou 2. Du coup, notre appli étant utilisé par beaucoup d'utilisateur, il arrive que des dizaines d'utilisateurs tentent de faire une modif pendant ce script de synchro. 10 maintenant mais d'ici 1 an cela sera peut être 100 clients qui feront un update pendant ce petit laps de temps.
Du coup j'hésite sur les mécanismes à mettre en place :
Retourner une erreur à Silverlight qui lui fera refaire l'appel WS une nouvelle fois en priant que ça passe (avec possibilité de refaire jusqu'à 3 fois l'appel sinon message "la base est actuellement indisp blablabla) solution la plus simple et rapide à mettre en place mais ...
Sinon, faire une stack des clients appelants et de la modifs qu'ils souhaitaient faire, et par un event que je ne connais pas encore, au COMMIT (et donc déverrouillage de la base) je parcours la liste, les traites puis fait un genre de push aux clients pour leurs indiquer que c'est bon.
Faire patienter le client plus longtemps jusqu'à ce que le script de synchro soit passé, puis reprendre la suite (je pensais que c'est ce qu'il se faisait par défaut) mais problème de timeout potentiel de 2 côtés : Silverlight avec WCF et EF qui me dégagerait car cela fait déjà 1 min que la table est verrouillé et qu'il n'a pas que ça à faire
J'ai plusieurs autres idées mais c'est dans le même genre. Donc je m'en remets à vos connaissances
Merci d'avance, Nicolas
Partager