Gemeinsame Sperren unter Read Committed Snapshot Isolation (RCSI)

9

LCK_M_SBei Verwendung von RCSI wird auf gemeinsam genutzte Sperren ( ) gewartet. Meines Wissens nach sollte dies nicht passieren, da SELECTsbei Verwendung von RCSI keine gemeinsamen Sperren erforderlich sind.

Wie kann ich freigegebene Sperren sehen? Liegt es an Fremdschlüsseln?

grassbl8d
quelle
Darf ich auch fragen, ob SQL Server gemeinsam genutzte Sperren für Datensätze setzt, wenn kein Index vorhanden ist, auch wenn read_committed_snapshot aktiviert ist?
grassbl8d

Antworten:

13

Wie kann ich freigegebene Sperren sehen? Liegt es an Fremdschlüsseln?

Ja. SQL Server kehrt beim Zugriff auf eine Tabelle zum Überprüfen der Fremdschlüsseleinschränkungen auf die Sperrimplementierung der isolierten Leseisolationsstufe zurück. Dies ist für die Richtigkeit erforderlich und kann nicht deaktiviert werden.

Das Verhalten gilt nur für Datenänderungsanweisungen. Freigegebene Sperren werden nur beim Überprüfen der fremdschlüsselbezogenen Daten verwendet. Andere Datenzugriffe im selben Ausführungsplan können weiterhin die Zeilenversionierung verwenden.

Wenn SQL Server dies nicht tut, können Datenänderungsanweisungen unter RCSIdie Fremdschlüsseleinschränkung verletzen, da bei der Integritätsprüfung veraltete (versionierte) Daten verwendet werden.

Leider gibt es derzeit keine unterstützte Möglichkeit, diese Änderung des Sperrverhaltens in einem Ausführungsplan anzuzeigen. Es ist möglich, die internen Sperrhinweise zu sehen, wenn das Ablaufverfolgungsflag 8607 aktiv ist.

Paul White 9
quelle