Sperrt die serialisierbare Isolationsstufe von SQL Server die gesamte Tabelle?


9

Ich und ein Kollege von mir diskutierten die Auswirkungen der Verwendung der serialisierbaren Isolationsstufe. Er sagte, es habe die gesamte Tabelle gesperrt, aber ich war damit nicht einverstanden, dass es möglicherweise möglich wäre, aber es versucht, Bereichssperren anzuwenden, und es wendet keine echte Serialisierung an, wie hier erläutert: Die serialisierbare Isolationsstufe .

Ich kann auch in den Dokumenten nichts für die "gesamte Tabelle sperren " finden: SET TRANSACTION ISOLATION LEVEL .

Das Dokument enthält eine Reihe von Informationen zu Bereichssperren. Theoretisch können Sie also die gesamte Tabelle sperren, indem Sie einfach eine Bereichssperre verwenden, die den gesamten Bereich möglicher Werte in der Tabelle sperrt, die Tabelle jedoch nicht sperrt.

Bin ich hier völlig falsch? Sperrt es tatsächlich die gesamte Tabelle (oder Tabellen)?

Antworten:


16

Eskalation jedoch

Die Sperreneskalation unter der serialisierbaren Isolationsstufe kann genauso erfolgen wie bei anderen Isolationsstufen.

  • Richtige Indizes können dazu beitragen, eine Eskalation der Sperren bis zu einem gewissen Punkt zu vermeiden
  • Das Sperren vieler Indizes erhöht die Wahrscheinlichkeit einer Sperreneskalation. Die Anzahl ist für alle Objekte für eine einzelne Anweisung kumulativ

Einige kurze Beispiele für die Verwendung einer einzelnen Tabelle mit einem einzelnen Index. ID ist der Primärschlüssel und der Clustered-Index für die Tabelle.

Eine Reihe

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN

UPDATE c
SET c.Score = 2147483647 
FROM dbo.Comments AS c
WHERE c.Id = 138; --One value

ROLLBACK

Für einen einzelnen ID-Wert ist das Sperren minimal.

+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X     | Comments      | KEY           |           1 |
| IX           | Comments      | OBJECT        |           1 |
| IX           | Comments      | PAGE          |           1 |
+--------------+---------------+---------------+-------------+

Mehrere Zeilen

Aber die Sperren werden aufgehen, wenn wir anfangen, in Bereichen zu arbeiten:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN

UPDATE c
SET c.Score = 2147483647 
FROM dbo.Comments AS c
WHERE c.Id BETWEEN 1 AND 5000; -- Small range

ROLLBACK

Jetzt haben wir exklusivere Schlösser für mehr Schlüssel:

+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| RangeX-X     | Comments      | KEY           |        2429 |
| IX           | Comments      | OBJECT        |           1 |
| IX           | Comments      | PAGE          |          97 |
+--------------+---------------+---------------+-------------+

Viel mehr Zeilen

Dies wird so lange fortgesetzt, bis wir einen Wendepunkt erreichen:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN

UPDATE c
SET c.Score = 2147483647 
FROM dbo.Comments AS c
WHERE c.Id BETWEEN 1 AND 11655; --Larger range

ROLLBACK

Eskalationssperre wird versucht und ist erfolgreich:

+--------------+---------------+---------------+-------------+
| request_mode | locked_object | resource_type | total_locks |
+--------------+---------------+---------------+-------------+
| X            | Comments      | OBJECT        |           1 |
+--------------+---------------+---------------+-------------+

Passt auf

Es ist wichtig, hier zwei Konzepte zu trennen: Die Isolationsstufe ist unabhängig von der Art der Sperren serialisierbar. Die Abfrage wählt die Isolationsstufe und die Speicher-Engine die Sperren. Serialisierbar führt nicht immer zu Entfernungssperren - die Speicher-Engine kann auswählen, welche Art von Sperren die Isolationsstufe noch einhalten.


5

Wenn ein Suchprädikat einen Index enthält, kann dieser für Bereichssperren verwendet werden .

Dh, sperren Sie von der ersten Reihe zur nächsten in Reichweite. Und von dieser neben der dritten Reihe usw. Bis zur letzten Reihe im Bereich. Also im Wesentlichen eine Reihe von Zeilensperren, aber es blockiert den Bereich von Einfügungen auch für "Zwischen" -Werte (Sperren des Bereichs).

Dazu benötigen Sie (SQL Server) einen Index, mit dem Sie arbeiten können. Ohne Indizes für die Sperrung (Indizes für Prädikate) erhalten Sie (soweit ich weiß) Tabellensperren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.