sql >> Database >  >> RDS >> Sqlserver

Time-outs voor transactiebereik begrijpen

Probeer het op deze manier te bekijken:

De lengte van de transactie wordt alleen bepaald wanneer u trans.Complete() aanroept of het transactiebereik verlaat. Neem de volgende code:

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

Er is geen manier om een ​​time-outuitzondering te maken terwijl u zich in de slaaproutine bevindt en het zou niet logisch zijn als dat wel het geval was. En dus kan het gebruik van transactietime-outs (althans op deze manier) alleen garanderen dat als de transactie langer duurt dan uw time-out, deze niet wordt vastgelegd.

Als u slechts één query uitvoert (waarvan ik niet zou weten waarvoor u de transacties gebruikt), kunt u de time-out voor query's / opdrachten instellen (of hoe u het ook noemt). IIRC, uw zoekopdracht wordt onmiddellijk geretourneerd nadat de time-out is verstreken.

Een andere manier is om de time-out voor uw webserviceverzoek in te stellen en er gewoon van uit te gaan dat de webservice er te lang over doet om te reageren vanwege wat zich in uw transactie bevond.

EDIT:je zou kunnen proberen:

  • Uw transactie op een andere thread voortbrengen en vervolgens wachten tot deze is voltooid (met behulp van Thread.Join(timeout)) op uw hoofdthread (een thread die wordt gebruikt door de webservice-aanroep). Dus als het niet eindigt vóór de time-out die je hebt opgegeven, kun je stoppen met wachten en een time-outfout retourneren (vergeet niet om de andere thread te signaleren om de transactie af te breken).
  • Ervan uitgaande dat u alleen SQL-query's uitvoert binnen die transacties, kunt u het sleutelwoord "BEGIN TRANSACTION" gebruiken om de transactie in het sql-script te specificeren (in feite gehackt). Dan kunt u gewoon de time-out van de opdracht specificeren en dit alles in een enkele regel code uitvoeren. Maar dan moet je alles wat je doet binnen de transactie naar een sql-script verplaatsen, wat al dan niet mogelijk voor je is... en het is niet schoon.



  1. Optimaliseer MySql-query:te traag bij het bestellen

  2. Laravel:een query pagineren in een weergave MySQL Error 1140 Mixing of GROUP-kolommen

  3. INSERT-instructie in PL/SQL mislukt in Oracle-database

  4. PostgreSQL+table-partitionering:inefficiënte max() en min()