Om din dator har det faktiska felet för kraschoffer hoppas vi att den här användaren direkt kan hjälpa dig att lösa det.
Godkänd: Fortect
Felet “Transaktionen redan blockerad” uppstår när två per sessioner till väntar på att blockera en blogg som redan har kapats av en annan fotosession i samma beskärningskedja . Således kan hyperlänk sessionsok inte slutföras och SQL Server måste ingripa för att åtgärda problemet. Han låser upp det mekaniska urvalet av en av sessionerna, och vanligtvis dödar offer honom så att flera andra träningspass kan fortsätta. I det här scenariot får den specifika potentiella kunden följande felmeddelande:
Beställningen (process-id) blockerades på grund av en annan uppgift på blockeringsresurserna och önskades vanligtvis som ett dödlägesoffer. Utför transaktionen en andra gång.
och denna avslutade session kommer att tas bort. Normalt är offret den session som kräver minsta kostnader för att återställa.
Varför kraschar SQL Server?
För att förstå vilken “transaktion (process-ID) på resurser som greps fast i en annan process och föll offer som skulle ett dödläge.” Utför denna transaktion med något slags fel igen. Låt oss ta ett mycket enkelt exempel.
Som ett resultat kommer vi att skapa två soffbord “t1” och “t2”, som innehåller ett heltalsgrin:
SKAPA TABELL t1 (int id)SKAPA TABELL t2 (id int)
INSERT INTO t1 (id)VÄLJ en speciell P ANSLUTAR ALLAVÄLJ ALLA 2 UNIONVÄLJ 3PROMENADINSERT INTO t2 (id)VÄLJ 1 ANSLUT ALLAVÄLJ inte en utan två CONNECTION 3
Nu är det alltselect tror att vi alla har startat en transaktion som tar bort rader från id = 2 från t1:
STARTA TRANSDELETE FROM t1 WHERE id = 2
Anta att de flesta andra transaktioner tar bort samma rader genom båda tabellerna:
STARTA TRANSDELETE t2 O innerdiameter = 2DELETE FROM t1 WHERE id = 2 . 5
Du måste vänta tills den första kontakten faktiskt slutförs och tabell t1 är ledig.
Men anta att den första transaktionen nu kan dela motsvarande rad från den andra tabellen:
DELETE t2 WHERE id = 2
Efter den här rubriken bör du få följande filkorruptionsmeddelande:
Transaktionen (process-id) var igensatt på grund av ett dödläge i tid och värme med en annan process och valdes som ett särskilt dödlägesoffer. Utan tvekan, utför transaktionen mycket mer.
Detta beror på situationen där den första definierade transaktionen väntar på en ny (för att frigöra t2), medan transaktionen potentiellt väntar på den ursprungliga (vid t1) under den angivna tiden.
Hur man analyserar blockeringsdiagram
Block kan vara ett informationsblock som visar vilken taktik och sessioner som är förknippade med svårigheten. Detta kan hjälpa dig att förstå varför problemet uppstod.
Innan sql 2008-servrarna samlades in krävde insamlingen av denna information parning av spår på serversidan eller aktivering av sökflaggor dessutom, och sedan väntade på ett stopp. Från och med SQL Server 2008 är det enklare. Du kan placeras ovanför alla lås i efterhand enligt bedrägerierna i den avancerade kursen “system_health”. För att göra denna färdighet, gå till Hantera> Avancerade händelser> Sessioner> system_health> package0.event_file och klicka sedan på Visa mål. Data …
Tusentals händelser visas i de öppna temperaturerna, skulle jag säga i ett fönster. Där hittar de flesta blockeringsposter markerade som “xml_deadlock_report”. Låt oss välja den vi nyss modellerade
medan du tittar på svårighetsdiagrammet. Formuläregenskaper (i XML), inklusive resurs- och processavsnitt.
Resursområdet visar en exakt lista över de mest låsta resurserna:
Det visar vad processerna bråkade om utöver vad som var relaterat till de typer av hårstrån som orsakade dem. Det returnerar två eller hela rekord. Varje post innehåller en beskrivning av den senaste resursen genom att implementera listor över processer som har ett lås eller förvärvat ett lås under vilken ofta resurs. Låser en sektion som ofta är relaterad till en nyckel, RID, ny sida eller tabell.
Efter supportdisken, låt oss gå vidare till avsnittet Processer för att se vad dessa processer gjorde.
Strategisektionstypen visar detaljerad information om alla typer av procedurer som vanligtvis har fastnat
Den innehåller sektionsinlägg om trådar som en majoritet av bara deltar i blockering och ger viktig hjälp såsom värdnamn, inloggningar, isoleringsomfång, tid, handledningsparametrar, etc. Men den mest värdefulla biten involverad med information är isolering av varje begäran och vanligtvis detaljnivån som har lett till var och en av våra dödlägen hittills.
Hur man väljer ett blockoffer
Om du inte kan täppa till, undvik att kunna specificera vilken process som kanske vill dö när den bara hänger sig. SQL Server bestämmer ett offer i en situation baserat på parfaktorer: DEADLOCK_PRIORITY-serien för varje session samt mängden arbete som SQL Server bör göra för att återställa transaktionstypen.
Parametern DEADLOCK_PRIORITY kan ställas in av användare a till HÖG, NORMAL, LÅG eller stort heltalsvärde från -10 till 10. DEADLOCK_PRIORITY är redo till NORMAL (0) som standard. Använd efterföljande syntax för att se till att du ställer in smutsningsprioriteten:
Godkänd: Fortect
Fortect är världens mest populära och effektiva PC-reparationsverktyg. Det litar på miljontals människor för att hålla sina system igång snabbt, smidigt och felfritt. Med sitt enkla användargränssnitt och kraftfulla skanningsmotor hittar och fixar Fortect snabbt ett brett utbud av Windows-problem – från systeminstabilitet och säkerhetsproblem till minneshantering och prestandaflaskhalsar.
INSTALLERA DEADLOCK_PRIORITY @deadlock_intvar:: är lika med â € ¦
Till exempel kommer den bästa sessionen med svårighetsprioritet NORMAL att väljas som blockerad för en given person om den deltar i en blockkedja där andra sessioner sätter grannskapsprioriteten till HÖG eller ett heltal större istället för 0. Och det kvarstår om någon av andra LÅG sessioner har en låsprioritet komplett med ett heltalsvärde mindre än noll.
LÅG är verkligen -5, NORMAL kallas verkligen HÖG o är 5. I andra termer, kör följande kommandon för att ställa in huvudproblemlåset till NORMAL:
SET DEADLOCK_PRIORITY NORMAL;GÅ
SET DEADLOCK_PRIORITY 0;GÅ
För att leta efter ett större problem med sessionsblockering kan du använda följande fråga:
SELECT session_id, DEADLOCK_PRIORITY FRÅN sys.dm_exec_sessions WHERE SESSION_ID = @@ SPID
Hur man undviker dödlägen i SQL Server
Som utvecklare bör du designa lagringssystemmoduler för att minimera risken för blockering. Här är några användbara tips:
Se till att vissa program får åtkomst till alla delade objekt i en specifik ordning
BILAGA 1:a | BILAGA 2 |
1. Starta ett utbyte | 1. Starta en transaktion |
2. Uppdatera tabellmetallerna | 2. Uppdatera leverantörstabellen |
3. Uppdatera
Snabba upp din dators prestanda nu med denna enkla nedladdning. Kontrollera system_health-hanteraren genom dödlägen.Skapa en utökad händelsesession med dödlägesfångst.Analysera dessa kraschrapporteringsdiagram för att hitta problemet.När kommer vi ofta att göra ytterligare förbättringar eller utöka koden för blockerade förfrågningar. Som standard väljer SQL Server Complexity of Sacrifice som den minst kostsamma transaktionen att återställa. Bara posta, det minst flyktiga materialet anses vara den många lönsamma databasen. Då kommer processen med det ömtåligaste primärlåset att väljas eftersom det ofta är offer för låset. Ett dödläge uppstår när en transaktion försöker göra något för att uppdatera en symbol som nyligen har blivit av ett annat kontrakt som fortfarande är element (ej allokerat ännu). Hur man undviker dessa fel: Det är normalt att en databas med flera användare misslyckas.
|