Domanda

Ho l'applicazione C # Windows. Quando "Pulsante 1" Fare clic in "Modulo 1" Ho un processo che scritto i dati su poche tabelle.Quel processo richiede normalmente 10 minuti. Quando un utente fai clic sul pulsante "Pulsante 1", un altro utente che utilizza lo stesso DB e il programma facendo clic su un altro pulsante in un altro modulo che inserisce i dati alle stesse tabelle.

Quando il pulsante 1 Facendo clic su Sto iniziando la transazione SQL e impedisce che dopo aver finito il processo.

Problema è quando si esegue quel processo, 2 ° utente ottenendo un errore di tempo e non può completare il suo processo.

Cosa posso fare per questo? Quando la transazione SQL che inizia è il blocco delle tabelle che utilizzano per il processo?

È stato utile?

Soluzione

.

Cosa posso fare per questo?

Rework La tua gestione delle transazioni.Seriamente.

.

Quell'elaborazione normalmente prendendo 10 minuti

Una transazione di 10 minuti non è pratica con nessun mezzo.Non riesco a vedere qualsiasi motivo per questo al di fuori della cattiva comoceazione - e sto facendo il lavoro del database per forse 20 anni tutto in tutto.Mai tollerato e aveva un vero bisogno di transazioni che a lungo, normalmente c'è un modo intorno ad esso.

Sì, è possibile modificare un timeout, ma questo significa utente 2 fissando lo schermo per 15 minuti.Non una soluzione reale.

Rework la tua transazione da un punto di vista logico.Che diamine fai lì che ci vogliono 10 minuti per iniziare?

Altri suggerimenti

Soluzione semplice Ma potrebbe aver bisogno dell'utente per attendere molto tempo.

Se si utilizza una discussione per eseguire questa file (WinForm) con label1 come lo stato di lavoro

   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...";
    }
.

Questo è il modo in cui di solito gestisco errore che non riesco a risolverlo.

Grazie

Una transazione è definizione bloccando altre transazioni Accesso alle stesse risorse perché è il modo in cui il server SQL garantisce che i dati siano persistiti presso il commit e non sono cambiati da qualcun altro. È il

Allora - Cosa puoi fare è far funzionare la transazione più velocemente, quindi non blocca e blocca a lungo. Applicare più a lungo attendere il secondo utente. O non utilizzare le transazioni. (o gestire la situazione "migliore" nel tuo livello di codice, se è "comportamento previsto")

Puoi anche controllare le tue transazioni che non blocca troppo, ma se il secondo processo ha davvero bisogno di accedere alle stesse risorse, dovrà aspettare.

Tuttavia, se veramente volendo ottenere "sporchi" puoi cambiare i livelli di isolamento per il server per consentire la lettura dei dati sporchi ma non è assolutamente qualcosa che avrei consigliato a meno che tu non sappia cosa stai facendo. Ma è qualcosa che può accelerare le query di lettura, ma può avere conseguenze piuttosto strane leggere dati sporchi e pagine di dati sporche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top