Question

J'ai C # Application Windows.Lorsque "Bouton 1" Cliquez sur "Formulaire 1" J'ai un processus qui écrit des données à quelques tables.Ce processus prend normalement 10 minutes. Lorsqu'un utilisateur clique sur ce bouton "1", un autre utilisateur qui utilise le même dB et le même programme en cliquant sur un autre bouton dans un autre formulaire qui insère des données aux mêmes tables.

Lorsque vous pouvez cliquer sur la transaction SQL et le fait de commencer après la fin du processus.

Problème est lors de l'exécution de ce processus, le 2e utilisateur obtient une erreur de sortie de temps et il ne peut pas terminer son processus.

Que puis-je faire pour cela? Lorsque le démarrage de la transaction SQL est de verrouiller les tables qui utilisent pour le processus?

Était-ce utile?

La solution

Que puis-je faire pour cela?

retravailler votre manipulation de transaction.Sérieusement.

Ce processus prend normalement 10 minutes

Une transaction de 10 minutes n'est pas pratique par aucun moyen.Je ne vois aucune raison de voir cette mauvaise concession de la mécontentement - et je fais des travaux de base de données pour peut-être 20 ans dans tous.Jamais toléré et a eu un réel besoin de transactions qui longs, normalement, il y a un moyen autour de cela.

Oui, vous pouvez modifier un délai d'attente, mais cela signifie que l'utilisateur 2 fixe à l'écran pendant 15 minutes.Pas une vraie solution.

retravailler votre transaction d'un point de vue logique.Quel diable faites-vous là-bas qui prend 10 minutes pour commencer?

Autres conseils

solution simple mais peut avoir besoin d'un utilisateur d'attendre longtemps.

Si vous utilisez un fil pour accomplir ceci (Winform) avec Label1 comme état de travail

   void transaction(data)
    { 
     try
     {
       thread.sleep(100);
       sqltransaction(data);//whatever your code is
     }
    catch(Exception)
     {
       transaction(data);
       label1.Invoke((MethodInvoker)(() => label1.Text = "Requested pending , do not close the program";
     }
       label1.Invoke((MethodInvoker)(() => label1.Text = "Working...";
    }

C'est la façon dont je traite habituellement l'erreur que je ne peux pas vraiment le réparer.

merci

Une transaction est par définition bloquant d'autres transactions Accès aux mêmes ressources, car c'est la manière dont le serveur SQL garantit que les données sont persistées à la commission et ne sont pas modifiées par quelqu'un d'autre. C'est le

Donc - ce que vous pouvez faire est de rendre votre transaction fonctionner plus rapidement, de sorte qu'il ne bloque pas et ne se verrouille pas longtemps. Appliquez une attente plus longue pour le deuxième utilisateur. Ou ne pas utiliser des transactions du tout. (ou gérer la situation "mieux" dans votre couche de code, s'il s'agit d'un "comportement attendu")

Vous pouvez également vérifier vos transactions qu'il ne bloque pas trop, mais si le deuxième processus doit vraiment accéder aux mêmes ressources, il faudra attendre.

Cependant, si vous voulez vraiment devenir "sale", vous pouvez modifier les niveaux d'isolation pour le serveur pour permettre la lecture des données sales, mais ce n'est absolument pas quelque chose que je conseillerais à moins que vous sachiez ce que vous savez. Mais c'est quelque chose qui peut accélérer les requêtes de lecture, mais elle peut avoir des conséquences plutôt étranges en lecture de données sales et de pages de données sales.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top