Problembeschreibung
Stellen Sie sich folgendes Szenario vor:
-
Sie verfügen über eine Microsoft SQL Server 2012-Datenbank, in der die Optionen ALLOW_SNAPSHOT_ISOLATION und READ_COMMITTED_SNAPSHOT aktiviert sind.
-
Sie verfügen über mindestens drei gleichzeitige Abfragen, die für dieselbe Tabelle ausgeführt werden.
-
Die Abfragen verwenden den (TABLOCK, UPDLOCK) Abfragehinweis.
-
Jede Abfrage wird in eine explizite Begin Tran -Anweisung eingeschlossen, die Commit Tran -Anweisung wird jedoch nicht ausgeführt.
Wenn in diesem Szenario die erste Abfrage zugesichert wurde, wird eine der anderen Abfragen blockiert. Wenn READ_COMMITTED_SNAPSHOT zusammen mit den Abfragehinweisen für TABLOCK und UPDLOCK aktiviert ist, nehmen die Sitzungen IX-Sperren für die Tabelle vor. Der Deadlock tritt auf, wenn die beiden parallelen Sitzungen versuchen, die IX-Sperren gleichzeitig in X-Sperren umzuwandeln. Wenn READ_COMMITTED_SNAPSHOT deaktiviert ist, erhalten die Sitzungen sechs sperren, die nicht blockiert werden, wenn Sie in X-Sperren konvertiert werden. Der Hotfix behebt dieses Verhalten, indem LCK_M_SCH_S Sperren anstelle von IX-Sperren gewährt werden, wenn READ_COMMITTED_SNAPSHOT mit TABLOCK -und UPDLOCK -hinweisen verwendet wird.HinweisDieses Problem tritt auch in Microsoft SQL Server 2008 R2 auf. Ein Hotfix für SQL Server 2008 R2 wird in Kürze veröffentlicht.
Fehlerbehebung
Das Problem wurde zuerst im folgenden kumulativen Update von SQL Server behoben.
Kumulatives Update 8 für SQL Server 2012 SP1 /en-us/help/2917531
Jedes neue kumulative Update für SQL Server enthält alle Hotfixes und alle Sicherheitsupdates, die im vorherigen kumulativen Update enthalten waren. Schauen Sie sich die neuesten kumulativen Updates für SQL Server an:
Status
Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.