Artikel-ID: 295108 - Geändert am: Freitag, 23. Dezember 2005 - Version: 3.5

Unvollständige Transaktion können halten große Anzahl von Sperren und Blockierungen verursachen

Auf dieser Seite

Alles erweitern | Alles schließen

Zusammenfassung

Wenn eine Transaktion nicht abgeschlossen ist, weil eine Abfrage ein Timeout oder weil der Batch mitten in eine Transaktion abgebrochen wird, ohne eine Commit- oder ROLLBACK-Anweisung zum Beenden der Transaktion, die Transaktion bleibt geöffnet, und alle während der Transaktion eingerichteten Sperren weiterhin aufrechterhalten werden. Nachfolgende Transaktionen unter derselben Verbindung ausgeführt werden als geschachtelte Transaktionen behandelt, sodass alle in dieser abgeschlossenen Transaktionen erworbene Sperren nicht freigegeben werden. Dieses Problem wiederholt mit alle Transaktionen, die über dieselbe Verbindung ausgeführt werden, bis ein ROLLBACK ausgeführt wird. Als Ergebnis eine große Anzahl von Sperren werden aufrechterhalten, Benutzer blockiert und Transaktionen sind verlorene, wodurch in den Daten, von den Erwartungen abweicht.

Weitere Informationen

Das folgende Beispiel veranschaulicht, wie Sperren als Ergebnis einer eine nicht beendete offene Transaktion nicht freigegeben werden:
  1. Öffnen Sie SQL Server Query Analyzer und führen Sie den folgenden Batch aber Transaktion abbrechen, bevor er abgeschlossen ist:
    Begin Tran
    Update authors set state = 'CA'
    waitfor delay "00:02:00" --Cancel the command
    Commit Tran
    					
  2. Anzeigen die Sperren, die gehalten werden, indem Sie den folgenden Befehl ausführen:
    sp_lock
    					
    angezeigt, dass für die Authors -Tabelle Sperren sind.

  3. Der gleiche Server Prozess-Id (SPID), Ausführen der nächste Batch:
    Begin Tran
    Update titleauthor set au_ord = 0
    Commit Tran - Completed transaction.
    					
  4. Anzeigen die Sperren, die gehalten werden, indem Sie den folgenden Befehl ausführen:
    sp_lock
    					
    angezeigt, obwohl die letzte Transaktion abgeschlossen ist, auf die Authors und Titleauthors Tabellen Sperren sind. Der Grund ist, dass die erste Transaktion nicht abgeschlossen, und wenn die zweite Transaktion aus derselben Verbindung ausgeführt wurde, wurde es als eine geschachtelte Transaktion behandelt.

    Sie können die Transaktionsanzahl der anzeigen, indem überprüft @@ Trancount globale Variable durch die folgende Anweisung ausgeben:
    select @@trancount
    					
    diese Abfrage gibt 1, gibt an, dass eine Transaktion ausstehenden.

    Behandelt alle weiteren Buchungen, die von dieser Verbindung ausgeführt werden als geschachtelt. Sperren weiterhin ansammeln und werden nicht freigegeben, bis ein ROLLBACK ausgeführt wird, welche Rollbacks auf die äußere Transaktion die meisten oder einen Sicherungspunkt.
In dem Beispiel fortsetzen, können Sie wie ein Rollback eine abgeschlossene Transaktion negierende ausführen die folgende Transaktion die gleiche Verbindung verursachen:
Begin Tran
Update titles set royalty = 0
Rollback
				
der Rollback Rollback den Batch mit der äußersten Transaktion, obwohl eine abgeschlossene Transaktion (2) auf Titleauthors vorhanden ist. Das Rollback für die abgeschlossene Transaktion rührt abgeschlossene Transaktion als eine geschachtelte Transaktion behandelt wird.

Um diese Art von Problem zu vermeiden, überprüfen Sie nach jeder Buchung, ob die Transaktion abgeschlossen, ist mithilfe der folgenden Anweisung:
If @@trancount > 0 rollback
				

Informationsquellen

Eine Beschreibung zum Überwachen mit SQL-Skripts in SQL Server 7.0 oder SQL Server 2000 blockieren finden Sie unter die folgenden Artikeln der Microsoft Knowledge Base:
251004  (http://support.microsoft.com/kb/251004/ ) Zum Blockieren von SQL Server 7.0 überwachen
271509  (http://support.microsoft.com/kb/271509/ ) Zum Überwachen von Sperren in SQL Server 2005 und in SQL Server 2000

Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Workgroup Edition
Keywords: 
kbmt kbinfo KB295108 KbMtde
Maschinell übersetzter ArtikelMaschinell ü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: 295108  (http://support.microsoft.com/kb/295108/en-us/ )
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.
 

SPRACHE AUSWÄHLEN