So sperren Sie explizit eine Tabelle in Microsoft SQL Server (auf der Suche nach einem Hack - unkooperativer Client)

8

Das war meine ursprüngliche Frage:

Ich versuche herauszufinden, wie EXCLUSIVE Tabellensperren in SQL Server erzwungen werden. Ich muss mit unkooperativen Lesern umgehen (außerhalb meiner Kontrolle, Closed-Source-Sachen), die explizit ihren ISOLATION LEVEL auf READ UNCOMMITTED setzen. Der Effekt ist, dass unabhängig davon, wie viele Sperren und welche Art von Isolation ich beim Einfügen / Aktualisieren festlege, ein Client nur die richtige Isolation einstellen muss und zurück zum Lesen meines Mülls läuft.

Die Antwort erwies sich als ziemlich einfach -

  

Während es keine Möglichkeit gibt, eine explizite Sperre auszulösen, löst jede DDL-Änderung die gesuchte Sperre aus.

Obwohl diese Situation nicht ideal ist (der Client blockiert statt wiederholbare Lesevorgänge), ist es viel besser, als wenn der Client die Isolation überschreibt und schmutzige Daten liest. Hier ist der vollständige Beispielcode mit dem Dummy-Trigger-Sperrmechanismus

GEWINNEN!

%Vor%

ERGEBNIS:

%Vor%     
Peter Rabbitson 12.07.2011, 15:53
quelle

3 Antworten

5

Ein Hack-Hack-Weg, um dies zu tun, ist, eine Operation auf der Tabelle zu erzwingen, die eine SCH-M-Sperre auf der Tabelle annimmt, die Lesevorgänge gegen die Tabelle sogar in der READ-UNCOMMITTED-Isolationsstufe verhindert. Wenn Sie beispielsweise einen Vorgang wie ALTER TABLE REBUILD (möglicherweise auf einer bestimmten leeren Partition, um die Auswirkungen auf die Leistung zu reduzieren) als Teil Ihrer Operation ausführen, wird der gleichzeitige Zugriff auf die Tabelle bis zum Commit verhindert.

    
stevehem 12.07.2011, 18:36
quelle
4

Fügen Sie Ihrem SELECT :

einen Sperrhinweis hinzu

SELECT COUNT(*) FROM artist WITH (TABLOCKX)

und setze deine INSERT in eine Transaktion.

Wenn sich Ihre erste Anweisung in einer expliziten Transaktion befindet, wartet% code_de% auf eine Sperre, bevor sie verarbeitet wird.

    
JNK 12.07.2011 16:00
quelle
3

Es gibt keine direkte Möglichkeit, das Sperren zu erzwingen, wenn sich eine Verbindung in der READ UNCOMMITTED Isolationsstufe befindet.

Eine Lösung wäre das Erstellen von Sichten über die gelesenen Tabellen, die den Tabellenhinweis READCOMMITTED liefern. Wenn Sie die vom Leser verwendeten Tabellennamen kontrollieren, könnte dies ziemlich einfach sein. Andernfalls haben Sie eine ziemlich mühsame Aufgabe, da Sie Writer entweder so modifizieren müssen, dass sie in neue Tabellen schreiben oder INSTEAD OF INSERT/UPDATE triggers für die Views erstellen.

Bearbeiten:

Michael Fredrickson weist mit Recht darauf hin, dass eine Ansicht, die einfach als Auswahl aus einer Basistabelle mit einem Tabellenhinweis definiert wird, keine aktualisierbaren Triggerdefinitionen erfordert. Wenn Sie die vorhandenen problematischen Tabellen umbenennen und durch Ansichten ersetzen würden, sollte der Drittanbieter-Client nicht klüger sein.

    
zinglon 12.07.2011 17:17
quelle

Tags und Links