table-locking

___ qstnhdr ___ MySQL Tabellensperrung: Halter liest und schreibt, andere Sitzungen nur gelesen? ___ answer13855143 ___

Es gibt %code% , mit denen die Zeilen gesperrt werden für andere Anrufer, die %code% haben, aber nicht für alle, die nur %code% tun. %code% s wartet ebenfalls auf die Sperre.

Dies ist nützlich, wenn Sie einen Wert abrufen und dann ein Update zurückschieben möchten, ohne dass jemand den Wert ändert und Sie nicht bemerken. Seien Sie vorsichtig, wenn Sie zu viel davon hinzufügen, geraten Sie in eine Sackgasse.

    
___ answer7882413 ___

Sehen Sie sich LOCK IN SHARE MODE an.

Damit können Sie nicht blockierende Lesesperren setzen.

Aber denken Sie daran, dies kann zu Deadlocks führen! Stellen Sie sicher, dass Sie mit Prozessen mit veralteten Informationen einverstanden sind.

    
___ answer13859221 ___

Es gibt viele korrekte Wörter in vorhandenen Antworten, aber niemand scheint eine klare Antwort gegeben zu haben. Ich werde es versuchen.

Wie Sie bereits in der Dokumentation zu LOCK TABLES gesehen haben, ist dies möglich nicht für den Zweck verwendet werden, da für die %code% lock:

  

Die Sitzung, die die Sperre hält, kann die Tabelle lesen (aber nicht schreiben).

und für die %code% lock:

  

Nur die Sitzung, die die Sperre enthält, kann auf die Tabelle zugreifen. Keine andere Sitzung kann darauf zugreifen, bis die Sperre aufgehoben wird.

Das ist der Effekt, der kaum mit einer beliebigen Engine-Tabelle erreicht werden kann, aber es kann mit einer Transaktions-Engine erreicht werden, das heißt InnoDB.

Denken wir darüber nach, was bedeutet, dass eine einzelne Sitzung eine konstante Schreibsperre für eine Tabelle behält und andere Tabellen Daten aus der Tabelle in Bezug auf Transaktionen lesen können. Das bedeutet, dass wir eine offene Long-Living-Transaktion haben (es sei %code% transaction), die eine Tabelle für Änderungen sperrt und andere Transaktionen (in anderen Sitzungen) Daten lesen können, die bereits modifiziert, aber noch nicht festgeschrieben sind. In Bezug auf Isolationsebenen bedeutet das, dass wir die Standardisolationsstufe auf %code% einrichten sollten, damit wir die Isolationsstufe für jede neue Sitzung nicht ändern müssen:

%Vor%

Aber unsere Transaktion %code% sollte eine stärkere Isolationsstufe verwenden, andernfalls können wir keine Sperre auf unsere Tabelle anwenden. %code% ist nicht stark genug, aber %code% ist genau das, was wir wollen. Vor dem Start einer %code% Transaktion sollten wir die Transaktionsebene für die aktuelle Sitzung festlegen:

%Vor%

Nun, wie Sie die ganze Tabelle sperren. Lassen Sie uns eine Tabelle erstellen:

%Vor%

LOCK IN SHARE-MODUS ist nicht das, was wir wollen:

  

Wenn eine dieser Zeilen [die gelesen werden] durch eine andere Transaktion geändert wurde, die noch nicht festgeschrieben wurde, wartet Ihre Abfrage bis zum Ende dieser Transaktion und verwendet dann die neuesten Werte.

LOCK FOR UPDATE scheint zu tun, was wir brauchen:

  

SELECT ... FOR UPDATE sperrt die Zeilen und alle zugehörigen Indexeinträge.

Jetzt brauchen wir nur noch die Zeilen zu sperren. Das Einfachste, was wir tun können, ist, den Primärschlüssel zu sperren. %code% führt eine vollständige Indexsuche nach InnoDB durch (da InnoDB die genaue Zeilenanzahl nicht kennt).

%Vor%

Jetzt können Sie andere Sitzungen öffnen und versuchen, die Daten aus der Tabelle zu lesen und versuchen, die vorhandenen Daten aus diesen Sitzungen hinzuzufügen oder zu ändern.

Das Problem ist jedoch, dass Sie die Änderungen in %code% festschreiben sollten, und sobald Sie die Transaktion festschreiben, wird die Sperre aufgehoben und alle wartenden Einfügungen oder Aktualisierungen werden ebenfalls angewendet, selbst wenn Sie sie mit folgendem Befehl festschreiben:

%Vor%

Die Moral der Geschichte ist, dass es viel einfacher ist, zwei MySQL-Konten zu haben: a) ein Konto mit INSERT, UPDATE und DELETE schreiben GRANT Berechtigungen , und b) lesen Konto, das nicht hat.

    
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ tag123mysql ___ MySQL ist ein freies, relationales Datenbank-Managementsystem (RDBMS), das die strukturierte Abfragesprache (SQL) verwendet. Verwenden Sie dieses Tag NICHT für andere DBs wie SQL Server, SQLite usw. Dies sind verschiedene DBs, die alle SQL verwenden, um die Daten zu verwalten. ___ qstntxt ___

Ist es möglich, eine Tabelle so zu sperren, dass der Inhaber lesen und schreiben kann und andere Sitzungen nur lesen können?

Die Dokumentation scheint anzudeuten, dass eine Lesesperre allen nur erlaubt Lesen, und eine Schreibsperre erlaubt nur dem Inhaber zu lesen und zu schreiben und andere Sitzungen haben keinen Zugriff. Es scheint so, als wäre der Inhaber in der Lage zu lesen und zu schreiben, und andere Sitzungen, die nur lesen können, wären ein ziemlich häufig benötigtes Verhalten - vielleicht das am häufigsten benötigte Verhalten.

Vielleicht wäre die Leistung bei der Implementierung dieses Szenarios zu hoch?

    
___ tag123tablocking ___ hilf uns dieses Wiki zu bearbeiten ___ tag123transactions ___ Eine Reihe miteinander verbundener Operationen, die alle erfolgreich sein müssen, damit einer von ihnen erfolgreich ist. Der Ausfall einer Operation führt zu einem Rollback aller Operationen in der Transaktion. ___ answer7882525 ___

Sie können feststellen, dass die InnoDB-Engine standardmäßig das tut, was Sie benötigen: Schreibvorgänge blockieren Lesevorgänge nicht. Sie müssen mit der Transaktionsisolationsstufe vorsichtig sein, damit Schreibvorgänge verfügbar sind, wenn Sie sie benötigen.

    
___
3
Antworten

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

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 I...
12.07.2011, 15:53
1
Antwort

Sperren einer Tabelle mit einer Auswahl in Entity Framework

Ich muss so etwas tun %Vor% mit Entity Framework. Ist das möglich? Ich habe ein TransactionScope mit der Isolationsstufe Serializable geöffnet, aber meine Auswahlmöglichkeiten sperren die Tabellen nicht. Ich möchte, dass sie gesperrt w...
26.10.2009, 16:31
4
Antworten

MySQL Tabellensperrung: Halter liest und schreibt, andere Sitzungen nur gelesen?

Ist es möglich, eine Tabelle so zu sperren, dass der Inhaber lesen und schreiben kann und andere Sitzungen nur lesen können? Die Dokumentation scheint anzudeuten, dass eine Lesesperre allen nur erlaubt Lesen, und eine Schreibsperre erlaubt...
24.10.2011, 21:39