Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Comprendere i timeout dell'ambito delle transazioni

Prova a vederla in questo modo:

La lunghezza della transazione viene determinata solo quando si chiama trans.Complete() o si esce dall'ambito della transazione. Prendi il seguente codice:

using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}

Non c'è modo di generare un'eccezione di timeout mentre si è all'interno della routine del sonno e non avrebbe senso se lo facesse. E quindi l'utilizzo dei timeout delle transazioni (almeno in questo modo) può solo garantire che se la transazione richiede più tempo del tuo timeout, non verrà eseguito il commit.

Se stai solo eseguendo una query (che non saprei per cosa usi le transazioni), puoi impostare il timeout query/comando (o come lo chiami). IIRC, la tua query tornerà immediatamente dopo la scadenza del timeout.

Un altro modo sarebbe impostare il timeout della richiesta del servizio Web e presumere che il servizio Web stia impiegando troppo tempo per rispondere a causa di qualsiasi cosa fosse all'interno della transazione.

EDIT:potresti provare:

  • Generazione della transazione su un thread diverso e quindi attendere il completamento (usando Thread.Join(timeout)) sul thread principale (quello utilizzato dalla chiamata del servizio web). Quindi, se non termina prima del timeout specificato, potresti interrompere l'attesa e restituire un errore di timeout (non dimenticare di segnalare all'altro thread di interrompere la transazione).
  • Supponendo che tu stia eseguendo solo query SQL all'interno di tali transazioni, puoi utilizzare la parola chiave "BEGIN TRANSACTION" per specificare la transazione nello script sql (in effetti hacky). Quindi potresti semplicemente specificare il timeout del comando ed eseguire tutto questo in una singola riga di codice. Ma poi questo richiede di spostare tutto ciò che fai all'interno della transazione in uno script sql che potrebbe essere possibile o meno per te... e non è pulito.