Info: Analysieren und Vermeiden von Deadlocks in SQLServer

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 169960 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Microsoft SQL Server verwaltet Transaktionskonsistenz von Integrität und die Datenbank mithilfe von Sperren. SQL Server, Version 6.5 optional verwendet für Einfügevorgänge Sperren auf Zeilenebene und für andere Vorgänge Sperren auf Seitenebene. Bei einem relationalen Datenbank-Managementsystem kann die Sperren zu Deadlocks zwischen Benutzern führen.

Z. B. angenommen, User1 (oder Verbindung1) hat eine Sperre auf Daten Artikel "A" und möchte eine Sperre auf Datenelement "B" User2 eine Sperre auf Datenelement "B" und möchte jetzt eine Sperre auf Datenelement "A" In diesem Szenario SQL Server User1 oder User2, werden eine Deadlock-Opfer werden, und der andere Benutzer wird die angeforderte Sperre erteilt werden.

In SQL Server kann die Anwendungsentwickler entscheiden, welche Verbindung der Kandidat für Deadlock-Opfer werden mithilfe von SET DEADLOCK_PRIORITY. Wenn der Entwickler eine Priorität für Deadlocks nicht angeben ist, wählt SQL Server Deadlock-Opfer indem des Prozess, der die kreisförmige Kette von Sperren abgeschlossen ist.

Datenbankanwendung Systeme verhalten sich möglicherweise anders Wenn aus einer relationalen Datenbank zu einem anderen portiert auf der Grundlage der relationalen Datenbanksystems Implementierung. Einer der Bereiche Verhalten Änderungen nach ist gesperrt. Dieser Artikel erläutert das Analysieren von Deadlocks in SQLServer und die Techniken vermeiden.

Weitere Informationen

In diesem Artikel wird hervorgehoben, verwenden die Ausgabe des Ablaufverfolgungsflags T1204 zum Analysieren von Deadlocks. Wenn Ablaufverfolgungsflags T1204 festgelegt ist, druckt SQL Server Informationen zu dem Deadlock beim auftreten. Verwenden Sie dieses Ablaufverfolgungsflags zu verwenden, den folgenden Befehl an einer Eingabeaufforderung den Befehl zum Starten von SQL Server:
   sqlservr -c -T1204
				

Die Ergebnisse der Ablaufverfolgung werden an das Konsolenfenster gesendet, Ablaufverfolgungsflag T3605, festlegen, die Ablaufverfolgungsausgabe an das Fehlerprotokoll sendet.

Deadlocks können auftreten, wenn zwei Verbindungen Tabellen in umgekehrter Reihenfolge aktualisieren. Eine Verbindung fügt beispielsweise in Tabelle "Beispiel1" first und dann in "Beispiel2", während eine andere Verbindung in der Tabelle "Beispiel2" first und dann in "Beispiel1" innerhalb einer Transaktion eingefügt. Ein Beispielszenario ist nützlich, um Deadlocks zu vermeiden, veranschaulichen.

Im folgenden sind die SQL­Anweisungen, die zum Erstellen der Tabelle für dieses Beispiel verwendet verwendet:
   create table example1 (column1 int, column2 char(20), column3 char(50))
   go
   create table example2 (column1 int, column2 char(20), column3 char(50))
   go
   declare @lvar int
   select @lvar = 0
   while @lvar < 500
   begin
   insert into example1 values (@lvar, 'AAA', 'CCC')
   insert into example2 values (@lvar, 'AAA', 'CCC')
   select @lvar = @lvar + 1
   end
   go
   create unique clustered index ex1ind1 on example1 (column1, column2)
   with fill factor = 90, PAD_INDEX
   go
   create unique clustered index ex2ind1 on example2 (column1, column2)
   with fill factor = 90, PAD_INDEX
   go
				

Beispiel 1: Tabelle Einfügungen in umgekehrte Reihenfolge

In diesem Beispiel wurden zwei Tabellen in umgekehrter Reihenfolge eingefügt, und ein Deadlock aufgetreten ist. Deadlocks können auch auftreten, wenn zwei oder mehr Verbindungen führen Sie Aktualisierungen oder Löschvorgänge auf Tabellen in umgekehrter Reihenfolge.
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example2 VALUES (200, 'AAAB', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (200, 'AAAB', 'CCC')
				

Zu diesem Zeitpunkt kann Verbindung1 Verbindung2 blockieren, da die Zeile, die Verbindung2 eingefügt wird, wobei Verbindung1 hat bereits eine Zeile eingefügt und eine Sperre, auf derselben Seite möglicherweise.
   Connection1 > INSERT INTO example2 VALUES (100, 'AAAA', 'CCC')
				

Zu diesem Zeitpunkt möglicherweise Verbindung2 Verbindung1, blockieren, da die Zeile, die Verbindung1 einfügen wird, auf derselben Seite werden kann, wobei Verbindung2 hat bereits eine Zeile eingefügt, und ist eine Sperre hält. Dies führt zu einen Deadlock.

Die Ausgabe für das Ablaufverfolgungsflag 1204 Wenn der Deadlock aufgetreten ist:
97/04/20 11:51:57.88 spid13   *** DEADLOCK DETECTED with spid 14 ***
   spid 13 requesting EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 14, dbid 6, page 0x188, table example2, indid 0x1
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example2 VALUES (100,
     'AAAA', 'CCC')
   spid 14 waiting for EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 13, dbid 6, page 0x180, table example1, indid 0x1
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES (200,
   'AAAB', 'CCC')
   VICTIM: spid 13, pstat 0x0000 , cputime 30
				

Jede Zeile der Deadlock-Ablaufverfolgung kann Benutzer feststellen Weitere Informationen zu einem Deadlock. Verbindung1 ist Spid 13 und Verbindung2 Spid 14 (Sie können die Spid-Verbindung mithilfe der gespeicherten Systemprozedur Sp_who zugeordnet bestimmen).
   >> 97/04/20 11:51:57.88 spid13   *** DEADLOCK DETECTED with spid 14 ***
   The deadlock was detected between spid 13 and spid 14.
   >> spid 13 requesting EX_PAGE (waittype 0x8005), blocked by:
   >>   EX_PAGE: spid 14, dbid 6, page 0x188, table example2, indid 0x1
   >>   pcurcmd INSERT(0xc3), input buffer: INSERT INTO example2 VALUES
   (100, 'AAAA', 'CCC')
				

SPID 13 EX_PAGE Sperre angefordert wurde und durch Spid 14, die EX_PAGE für 0x188 auf Tabelle Beispiel2 Seite Sperren bereits in Dbid 6 blockiert wurde. Die Sperre wird auf der Seite zu gruppierten Index gehören aufrechterhalten.
      Indid Value         Description
-------------------------------------
         0                Data page if there is no clustered index, or the
                          leaf page of a clustered index if there is one
         1                Non-leaf page of the clustered index page
       255                Text/image page
    Any other value       Non-clustered secondary index
				

Der aktuelle Befehl ausgeführt, indem Spid 13 ist eine INSERT- und die Ablaufverfolgung gibt Teil des Eingabepuffers.
   >> spid 14 waiting for EX_PAGE (waittype 0x8005), blocked by:
   >>   EX_PAGE: spid 13, dbid 6, page 0x180, table example1, indid 0x1
   >>   pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES
   (200, 'AAAB', 'CCC')
				

SPID 14 EX_PAGE Sperre wartet und ist blockiert durch Spid 13, enthält bereits EX_PAGE Sperren auf derselben Seite.
   >> VICTIM: spid 13, pstat 0x0000 , cputime 30
   SQL Server has chosen spid 13 as the deadlock victim.
				

Der folgende Code ist eine Erläuterung der Bedeutung der verschiedenen Sperren in der Ablaufverfolgung:

SH_INT und EX_INT
Beabsichtigte Sperren, die zu einem übergeordneten Element (z. B. eine Tabelle), bevor auf niedrigerer Ebene Sperren (z. B. eine Seite durchgeführt werden) können übernommen werden, da der Sperren-Manager die Beziehung zwischen verschiedenen Typen von Elementen (in diesem Fall, Seiten und Tabellen) nicht bekannt ist. Wenn eine Sperre EX_INT nicht in der Tabelle aufgenommen wurde vor EX_PAG Sperren auf den Seiten, eines anderen Benutzers erlangen einer Sperre EX_TAB auf derselben Tabelle, und der Sperren-Manager würde nicht wissen, dass ein Konflikt vorhanden war. Derzeit verfügt SQL Server beabsichtigte Sperren nur auf Tabellen. Es gibt zwei Arten von beabsichtigte Sperren: freigegebene (SH_INT) und exklusive (EX_INT) sperren.

EX_PAGE
Dies ist eine exklusive Seitensperre, die ausgeführt wird, wenn eine Seite, aufgrund von einer DELETE, Update-aktualisiert wird oder INSERT-Anweisung mit einfügen Sperren auf Zeilenebene (Locking, IRL) deaktiviert.

UP_PAGE
Diese Seite eine Aktualisierungssperre, die anstelle einer freigegebenen Seitensperre ausgeführt wird, wenn eine Seite gescannt und der Abfrageoptimierer erkennt, dass die Seite aktualisiert wird (oder der UPDLOCK-Hinweis verwendet wird).

PR_EXT, NX_EXT, UPD_EXT und EX_EXT
Diese Sperren werden übernommen, wenn reservieren oder Freigeben von Speicherplatz. UPD_EXT wird übernommen, wenn reservieren oder Freigeben einer Seite von einem vorhandenen Block und die anderen werden verwendet, wenn reservieren oder Freigeben von ganzen Blöcke.

IX_PAGE und LN_PAGE
Diese sind IRL sperren. IX_PAGE ist eine beabsichtigte-zu--Zeile-sperren Sperre auf einer Seite. LN_PAGE bei einer Seite stammt auf dem IRL Anforderungen aufgeteilt werden durchgeführt wird.

RLOCK und XRLOCK
Diese kurzfristigen Sperren werden übernommen, wenn eine Index-b-Struktur zu durchlaufen. Gibt es zwei Arten dieser Art von Sperre: freigegebene (RLOCK) und exklusive (XRLOCK). Gemeinsame Sperren werden während der Überprüfung, übernommen, während exklusive Sperren während einer Aktualisierung auf Indexseiten aufgenommen werden.

EX_TAB
Dies ist die Tabelle exklusiv zu sperren, das auftritt, wenn SQL Server-Abfrageoptimierer ermittelt, dass ein Tabellenscan die effizienteste Methode zum Lösen einer Aktualisierungsabfrage (z. B. ist, wenn in einer Tabelle keine Indizes vorhanden sind). EX_TAB Sperren werden auch wenn Sie die Tabelle mit TABLOCKX Hinweis oder SQL Server die Seitensperren auf einer Tabelle zu einer Tabellensperre eskaliert Sperren angezeigt.

SH_TAB
Dies ist eine freigegebene Tabellensperre, die bei der Optimierer wird davon, dass die meisten der in der Tabelle ausgegangen verwendet wird gescannt (oder Seitensperre eskaliert) oder der TABLOCK-Hinweis verwendet wird.

Im vorherigen Beispiel Deadlock kann vermieden werden, wenn die beiden Verbindungen Tabellen in der folgenden Reihenfolge aktualisieren:
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (200, 'AAAB', 'CCC')
   Connection2 > INSERT INTO example2 VALUES (200, 'AAAB', 'CCC')
   Connection1 > INSERT INTO example2 VALUES (100, 'AAAA', 'CCC')
				

Beispiel 2: Einfügungen auf unterschiedliche Teile derselben Tabelle

Dieser Deadlock kann auch auftreten, wenn zwei Verbindungen in verschiedene Teile derselben Tabelle in umgekehrter Reihenfolge, einfügen Wenn Zeilen Seiten freigeben. Beispiel:
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (400, 'AAAB', 'CCC')
   Connection1 > INSERT INTO example1 VALUES (400, 'AAAA', 'CCC')
				

In dieser Beispieltabelle besteht ein gruppierter Index für die erste Spalte der Tabelle Beispiel1. Zeilen mit den gleichen Werten für die erste Spalte werden dagegen auf derselben Seite liegen. Im Beispiel wird die zweite Zeile von Verbindung1 eingefügt wahrscheinlich auf derselben Seite wie der ersten Zeile von Verbindung2, eingefügt fallen, da beide einen gruppierten Indexwert von 400 aufweisen. Dadurch Verbindung2 Block Verbindung1.
   Connection2 > INSERT INTO example1 VALUES (100, 'AAAB', 'CCC')
				

Verbindung2 kann jetzt auch durch Verbindung1, führt zu einem Deadlock blockiert werden. Die Deadlock-Ablaufverfolgung ist:
   97/04/20 12:56:01.40 spid16   *** DEADLOCK DETECTED with spid 15 ***
   spid 16 requesting EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 15, dbid 6, page 0x2c5, table example1, indid 0
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES (100,
   'AAAB', 'CCC')
   spid 15 waiting for EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 16, dbid 6, page 0x8bd, table example1, indid 0
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES (400,
   'AAAA', 'CCC')
   VICTIM: spid 16, pstat 0x0000 , cputime 130
				

Die Spid 16 Anforderung für die Sperre für Seite 0x2c5 EX_PAGE wird von der Spid 15, blockiert bereits für Seite 0x2c5 EX_PAGE Sperren enthält, nachdem es das erste einfügen haben. Und Spid 15 haben auch durch Spid 16 auf Warten auf eine Sperre EX_PAGE für führende Seite 0x8db zu Deadlock blockiert.

Dieser Deadlock kann mithilfe des folgenden Befehls zum Aktivieren von IRL für Tabelle Beispiel1 vermieden werden:
   sp_tableoption 'example1', 'insert row lock', true
				

Beispiel 3: Einfügungen mit IRL

IRL kann zwei oder mehr Benutzer eine Seite freizugeben, wenn Sie nur Operationen, einfügen, häufig besseren Durchsatz. Allerdings reduziert IRL aktivieren nicht immer Deadlocks. In einigen Fällen kann IRL Deadlocks führen.
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (105, 'AAAB', 'CCC')
				

Mit IRL, die aktiviert werden werden beide Verbindungen eine IX_PAGE-Sperre auf der Seite enthält zwei neuen Zeilen halten. Wenn IRL deaktiviert wurde, Verbindung1 würde eine EX_PAGE-Sperre erworben haben und Verbindung2 würde haben gesperrt sofort.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

Verbindung2 benötigt zu diesem Zeitpunkt eine exklusive Seitensperre dazu eine UPDATE-Anweisung, die mit der Verbindung1 IX_PAGE Sperre nicht kompatibel ist. Daher wird Verbindung2 warten.
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 100
   and column2 = 'AAAA'
				

Jetzt kann Verbindung1 durch Verbindung2, führt zu einem Deadlock blockiert werden. Die Deadlock-Ablaufverfolgung ist:
   97/04/20 15:13:50.07 spid17   *** DEADLOCK DETECTED with spid 18 ***
   spid 17 requesting UP_PAGE (waittype 0x8007), blocked by:
     IX_PAGE: spid 18, dbid 6, page 0x2c5, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCA' where column1 = 100 and column2 = 'AAAA'
   spid 18 waiting for UP_PAGE (waittype 0x8007), blocked by:
     IX_PAGE: spid 17, dbid 6, page 0x2c5, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCB' where column1 = 105 and column2 = 'AAAB'
   VICTIM: spid 17, pstat 0x0000 , cputime 20
				

SPID 17 (Verbindung eine) wartet auf eine Sperre UP_PAGE die erste Schritt zum Abrufen einer Seitensperre exklusiv ist. Es wird durch Spid 18, gesperrt auf Seite 0x2c5 IX_PAGE Sperren enthält. SPID 18 UP_PAGE Sperre warten ist, auf derselben Seite, und durch IX_PAGE Sperre Spid 17 gesperrt ist. Dies führt zu einem Deadlock, da IX_PAGE sperren, freigegeben, ist während UP_LOCK nicht. Während der ersten Einfügungen sowohl die Spids erhielt IX_PAGE Sperren auf derselben Seite, und später Sie versucht, die Sperre auf UP_PAGE Sperren zu aktualisieren, da UP_PAGE Sperre exklusiv ist nicht möglich ist.

Die eine Möglichkeit um den Deadlock zu vermeiden, besteht darin, den aktualisierten Wert direkt in die Tabelle anstelle von einfügen und aktualisieren anschließend die Zeile in der gleichen Transaktion einfügen. Wenn dies nicht möglich ist, helfen mit dem folgenden Befehl IRL deaktivieren um Deadlocks zu vermeiden:
   sp_tableoption 'example1', 'insert row lock', false
				

Beispiel 4: Einfügungen in Zeilen auf der gleichen Seite

Ein Deadlock kann auch führen, wenn die zwei Spids arbeiten Zeilen unterscheiden sich jedoch zu derselben Seite gehören.
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (400, 'AAAB', 'CCC')
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 405
   and column2 = 'AAAA'
				

Zu diesem Zeitpunkt möglicherweise Verbindung1 durch Verbindung2 blockiert werden. Diese Situation kann auftreten, weil Verbindung1 möchte eine Zeile in einer Seite zu aktualisieren, wobei Verbindung2 bereits eine Zeile eingefügt hat.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

Zu diesem Zeitpunkt möglicherweise Verbindung2 auch durch Verbindung1, blockiert werden die zu einem Deadlock führen wird. Diese Situation kann auftreten, wenn Verbindung2 möchte eine Zeile in einer Seite aktualisieren, wo Verbindung1 eine Zeile eingefügt hat. Die Deadlock-Ablaufverfolgung ist:
   97/04/20 15:48:21.18 spid20   *** DEADLOCK DETECTED with spid 19 ***
   spid 20 requesting UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 19, dbid 6, page 0x2c4, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCB' where column1 = 105 and column2 = 'AAAB'
   spid 19 waiting for UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 20, dbid 6, page 0xc48, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCA' where column1 = 405 and column2 = 'AAAA'
   VICTIM: spid 20, pstat 0x0000 , cputime 60
				

Dieser Deadlock kann durch das verteilen, die Zeilen über unterschiedliche Seiten vermieden werden. Eine Methode dazu besteht darin, den gruppierten Index in dieser Tabelle mit einem großen Füllfaktor neu erstellt. Dies ist eine Anweisung, die einen gruppierten Index mit einem Füllfaktor von 50 % erstellt:
   create unique clustered index ex1ind1 on example1 (column1, column2)
   with fill factor = 50, PAD_INDEX
				

Diese Anweisung erstellt den gruppierten Index die Hälfte der Seiten leer, einschließlich der nicht-Blattebene-Ebenen des gruppierten Indexes (wegen der PAD_INDEX-Option) lassen. In der Tabelle belegt double die tatsächliche Größe, und die Anzahl der Zeilen pro Seite sind die Hälfte der was Sie waren.

Der Füllfaktor ist auf einer Tabelle nicht beibehalten; die Tabelle ist nur während der Erstellungszeit Index mit den angegebenen Füllfaktor re-organized. Im Laufe der Zeit werden die Zeilen pro Seite von des Füllfaktors während der Indexerstellung geändert. Wenn dies der Fall ist, kann es ratsam, den gruppierten Index mit der gewünschten Füllfaktor neu erstellt sein.

Eine andere Lösung vorherigen Deadlocksituation zu vermeiden besteht darin, füllt die Tabelle mit dummy-Spalten (z. B. dummy1 char(255)). Dies erhöht die Größe der Zeile und führt zu weniger Zeilen pro Seite (möglichst wenige als eine Zeile pro Seite). Da diese Art der Füllzeichen Zeit geführt wird, müssen Sie neu erstellt den gruppierten Index um den Textabstand verwalten (Obwohl Sie möglicherweise den gruppierten Index auch aus anderen Gründen neu erstellen möchten). Der Nachteil dieser Technik ist, dass dummy Felder Speicherplatz verschwendet wird.

Beispiel 5: Abstand Zeilen

Textabstand Zeilen führt zu weniger Zeilen pro Seite (daher weniger Deadlocks), aber es werden Deadlocks nicht vollständig beseitigt.

In dieser Beispieltabelle wird Beispiel1 aufgefüllt, um eine Zeile pro Seite einzunehmen. Im folgenden werden die Anweisungen zum Erstellen der Tabelle für dieses Beispiel verwendet:
   create table example1 (column1 int, column2 char(20), column3 char(50),
   dummy_column4 char (255), dummy_column5 char (255), dummy_column6 char
   (255))
   go
   create unique index ex1ind5 on example1 (column3, column2, column1,
   dummy_column4, dummy_column5, dummy_column6) with fill factor = 85
   go
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC', ' ', ' ',
   ' ', ' ')
   Connection2 > INSERT INTO example1 VALUES (400, 'AAAB', 'CCC', ' ', ' ',
   ' ', ' ')
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 401
   and column2 = 'AAAA'
				

Zu diesem Zeitpunkt ist Verbindung1 durch Verbindung2 blockiert, während der Aktualisierung der Zeile. Da SQL Server-Seitenkette Zeiger beibehalten muss, sperrt es die vorherige Seite, die nächste Seite und der Seite, die aktualisiert werden. Da Verbindung2 eine Sperre auf der vorherigen Seite enthält, müssen Verbindung1 warten, bis Verbindung2 führt einen die Transaktion Commit.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 101
   and column2 = 'AAAB'
				

Zu diesem Zeitpunkt ist Verbindung2 von Verbindung1 gesperrt, weil die vorherige Seite Sperren müssen, die aktuell durch Verbindung1 gesperrt ist. Das Ergebnis ist ein Deadlock. Die Deadlock-Ablaufverfolgung ist:
   spid 20 requesting UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 19, dbid 6, page 0x12b5, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCB' where column1 = 101 and column2 = 'AAAB'
   spid 19 waiting for UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 20, dbid 6, page 0x1531, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCA' where column1 = 401 and column2 = 'AAAA'
   VICTIM: spid 20, pstat 0x0000 , cputime 300
				

Dieser Deadlock kann vermieden werden, indem dummy Zeilen zwischen die Zeilen, die, aktualisierte oder gelöschte eingefügt werden. Beispielsweise wenn Verbindung1 Zeile Pk (Einfügungen, Aktualisierungen oder löscht) zusammenarbeitet = 1 und Verbindung2 funktioniert mit Zeile Pk = 5, eine Zeile zwischen diesen zwei Zeilen einfügen (z. B. eine Zeile mit Pk = 3) Deadlocks vermieden. Diese Methode auch erhöht die Größe der Tabelle jedoch möglicherweise die beste Lösung für diese Warteschlange Tabellen für die Anwendung von entscheidender Bedeutung.

Beispiel 6: Nicht gruppierte Indizes

In einigen Fällen können die sekundären Indizes nicht gruppierte Deadlocks führen. In diesem Beispiel führt die Verwaltung der der sekundäre Index Deadlock.

Dies ist die Anweisung zum den in diesem Beispiel verwendeten sekundären Index zu erstellen:
   create index ex1ind2 on example1 (column3) with fill factor = 90,
   PAD_INDEX
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCBA', ' ', '
   ', ' ', ' ')
   Connection2 > INSERT INTO example1 VALUES (300, 'AAAB', 'CCCZ', ' ', '
   ', ' ', ' ')
   Connection2 > UPDATE example1 SET column3 = 'CCBA' where column1 = 105
				

Zu diesem Zeitpunkt möglicherweise Verbindung2 durch Verbindung1 blockiert werden, da Verbindung1 möglicherweise auf der Seite sekundäre nicht gruppierten Index Sperren werden, in denen Verbindung2 aktualisieren muss.
   Connection1 > UPDATE example1 SET column3 = 'CCCZ' where column1 = 305
				

Zu diesem Zeitpunkt möglicherweise Verbindung1 durch Verbindung2, was zu einem Deadlock blockiert werden. Diese Situation kann auftreten, wenn Verbindung1 eine Sperre den sekundären nicht gruppierten Index aktualisieren warten, wobei Verbindung2 wurde bereits eingefügt und eine Sperre auf der Seite. Die Deadlock-Ablaufverfolgung für dieses Beispiel Deadlock ist:
   97/04/20 19:05:38.75 spid11   *** DEADLOCK DETECTED with spid 12 ***
   spid 11 requesting EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 12, dbid 6, page 0x112f, table example1, indid 0x2
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCZ' where column1 = 305
   spid 12 waiting for EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 11, dbid 6, page 0x1108, table example1, indid 0x2
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCBA' where column1 = 105
   VICTIM: spid 11, pstat 0x0000 , cputime 50
				

Dieser Deadlock kann durch Ablegen des sekundären Indexes vermieden werden. Es ist nicht möglich zum Vervollständigen des Indexes für eine Zeile pro Seite enthalten, sodass diese Situation nur durch Beseitigen des sekundären nicht gruppierten Indexes oder durch Ändern der Anwendung vermieden werden kann.

Mit mehr als zwei Verbindungen kann zu Deadlocks führen in diesem Fall führt die Deadlock-Ablaufverfolgung Spids, die am Deadlock und auch in Konflikt stehende Sperren beteiligt. Deadlocks können mit RLOCK und XRLOCK Sperren auftreten, die während der Index durchlaufen erworben werden. Deadlocks können auch aufgrund von Umfang Sperren (PR_EXT, NX_EXT, UPD_EXT & EX_EXT) auftreten.

Weitere Informationen zum Analysieren von Deadlocks können Sie die folgenden Ablaufverfolgungsflags aktivieren:

T1200
Druckt alle die Sperrinformationen für Anforderung-Version Wenn es auftritt, ob ein Deadlock oder nicht beteiligt ist. Dies ist hinsichtlich der Leistung teuer, aber es kann für die Analyse nützlich sein.

T1206
Druckt alle Spids am Deadlock beteiligten Sperren.

T1208
Druckt den Host Namen und vom Client angegebene Programmname. Dies kann helfen, identifizieren einen Client an einem Deadlock beteiligten vorausgesetzt, der Client einen eindeutigen Wert für jede Verbindung angibt.

Eigenschaften

Artikel-ID: 169960 - Geändert am: Donnerstag, 16. Oktober 2003 - Version: 3.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 6.5 Standard Edition
Keywords: 
kbmt kbhowto kbusage KB169960 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 169960
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Disclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com