sql >> Databasteknik >  >> RDS >> Sqlserver

Förstå transaktionsomfångets timeouts

Försök att se det så här:

Längden på transaktionen bestäms bara när du anropar trans.Complete() eller lämnar transaktionsomfånget. Ta följande kod:

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

Det finns inget sätt att kasta ett timeout-undantag medan du är inne i sömnrutinen och det skulle inte vara vettigt om det gjorde det. Och så att använda timeout för transaktioner (åtminstone på detta sätt) kan bara garantera att om transaktionen tar längre tid än din timeout kommer den inte att genomföras.

Om du bara kör en fråga (som jag inte vet vad du använder transaktionerna till) kan du ställa in tidsgränsen för frågan/kommandot (eller vad du nu kallar det). IIRC, din fråga kommer att återkomma omedelbart efter att timeout löper ut.

Ett annat sätt skulle vara att ställa in din webbtjänstbegäran timeout och bara anta att webbtjänsten tar för lång tid att svara på grund av vad som än fanns i din transaktion.

EDIT:Du kan prova:

  • Skapa din transaktion på en annan tråd och vänta sedan på att den ska slutföras (med Thread.Join(timeout)) på din huvudtråd (en som används av webbtjänstanropet). Så om det inte avslutas före timeouten du angav kan du sluta vänta och returnera ett timeoutfel (glöm inte att signalera till den andra tråden att avbryta transaktionen).
  • Förutsatt att du bara utför SQL-frågor i dessa transaktioner, kan du använda nyckelordet "BEGIN TRANSACTION" för att specificera transaktionen i sql-skriptet (hackigt faktiskt). Sedan kan du bara ange kommandot timeout och köra allt detta på en enda rad kod. Men då kräver detta att du flyttar allt du gör i transaktionen till ett sql-skript som kanske eller kanske inte är möjligt för dig... och det är inte rent.



  1. APEX-installationen misslyckas, PLS-00201:identifierare 'SYS.DBMS_DB_VERSION' måste deklareras

  2. Åtkomst till slumpmässiga rader från databasen utan upprepning

  3. java säkerhetsundantag:förseglingsbrott vid försök att ansluta till databasen

  4. C#-fråga:'System.InvalidOperationException' | Ytterligare information:Anslutningen måste vara giltig och öppen