Dies ist eine bescheidene Frage, die gestellt wird, um mein Wissen zu erweitern. Sei freundlich in deiner Antwort.
Als langjähriger Anwendungsentwickler weiß ich auf einer bestimmten Ebene, was eine Transaktion ist (ich verwende sie die ganze Zeit). Abgesehen von den Isolationsstufen für Transaktionen kann ein Arbeitsblock auf hoher Ebene vollständig oder gar nicht abgeschlossen werden, und es ist ein gewisses Maß an Isolation von anderen datenbankmodifizierenden Aktivitäten möglich.
Ich weiß auch, was (in verschiedenen Datenbanken) eine Sperre ist oder zumindest, wie sich eine Sperre verhält (wenn ich eine Tabelle explizit sperre, kann kein anderer Prozess oder Thread etwas über diese Tabelle aktualisieren).
Was mir am deutlichsten nicht klar ist: Wenn ich in verschiedenen Datenbanken explizit eine Zeile oder eine Tabelle sperre, verwende ich genau dieselben Konstrukte, die von den Transaktionseinrichtungen der Datenbank unter der Deckung verwendet werden, damit die Transaktion ordnungsgemäß funktioniert?
Das heißt, es fällt mir ein, dass eine Transaktion, um atomar und isoliert zu sein, eine Sperrung durchführen muss. Handelt es sich bei diesem transaktionsinitiierten, durch Transaktion verborgenen Sperren um dieselbe Art von Sperren, auf die ich mithilfe von Konstrukten wie SELECT FOR UPDATE
oder expliziten LOCK
Befehlen aus verschiedenen Datenbanken zugreifen kann ? Oder sind diese beiden Konzepte völlig unterschiedlich?
Wieder entschuldige ich mich für die Naivität dieser Frage; Ich freue mich, auf weitere grundlegende Quellen hingewiesen zu werden.
quelle
Einige Hintergrundinformationen, bevor Sie Ihre Fragen beantworten:
Hinweis: Dies bezieht sich auf Microsoft SQL Server - RDBMS ........
Nun zurück zu deinen Fragen:
Ja. Dies bedeutet, dass Sie die Reihenfolge der Daten, die geändert werden und die die Datenbank in einem konsistenten Zustand belassen, sorgfältig festlegen müssen. Mit anderen Worten, Ihre DML-Operation sollte die Datenbank in einem konsistenten Zustand belassen, der sich auf die Geschäftsregeln Ihrer Organisation beschränkt. Dennoch kann das RDBMS (hier SQL Server) die physische Integrität der Transaktion erzwingen.
Über BOL: Sperren und Versionskontrolle verhindern, dass Benutzer nicht festgeschriebene Daten lesen und dass mehrere Benutzer gleichzeitig versuchen, dieselben Daten zu ändern. Ohne Sperren oder Zeilenversionierung können Abfragen, die für diese Daten ausgeführt werden, zu unerwarteten Ergebnissen führen, indem Daten zurückgegeben werden, die noch nicht in der Datenbank festgeschrieben wurden.
Alles in SQL Server ist in einer Transaktion enthalten. Wenn Sie auf Ihre Daten zugreifen, muss das RDBMS abhängig von der Isolationsstufe und den Vorgängen, die Sie für Ihre Daten ausführen, Sperren ausführen. Überprüfen Sie diese Antwort für weitere Details.
Einige gute Referenzen:
quelle
Ich würde sagen, Transaktionen sind in gewissem Sinne Teil der "Schnittstelle" der Datenbank. Sie als Entwickler entscheiden, wann sie beginnen, enden, was im Rahmen von Transaktionen zu tun ist usw. Sperren gehören, wie ich sie sehe, zu den Implementierungsdetails und für die Zugriffssynchronisation auf verschiedene Objekte verwendet. In den meisten Fällen entscheidet der Motor selbst, was und wie lange gesperrt werden soll. Es gibt viele Sperren auf Systemebene, die nicht direkt manipuliert werden können (z. B. kann die Engine bestimmte Speicherbereiche sperren). Selbst wenn es um DML-Sperren geht, geschieht dies häufig im Hintergrund (z. B. um die referenzielle Integrität von Oracle zu gewährleisten. Soweit ich mich erinnere, kann SQLServer eine entsprechende Zeile in der Master-Tabelle sperren, wenn ein neuer Datensatz eingefügt wird Detailtabelle) als Ergebnis von DML-Anweisungen, die innerhalb der Transaktion ausgegeben wurden.
Bei Transaktionen können Sie von jedem RDMS, das behauptet, SQL- und Support-Transaktionen zu erfüllen, ein mehr oder weniger konsistentes Verhalten erwarten. Bei Sperren verwendet jedoch fast jeder Anbieter eine andere Strategie und Terminologie. Der gemeinsame Teil aller RMDS ist, soweit ich das beurteilen kann, dass die Parallelität zwischen Transaktionen durch die Isolationsstufe definiert wird, während die Parallelität zwischen Sperren durch Sperrentypen (gemeinsam genutzt, exklusiv usw.) gesteuert wird.
Zusammenfassend ist festzuhalten, dass Sperren ein Mechanismus auf niedriger Ebene sind, um die Konsistenz von Objekten und die Parallelität zu steuern. Während der Ausführung von SQL-Anweisungen können Sperren ausgegeben werden. Abhängig von der Implementierung der Transaktionsisolationsstufe kann die Engine verschiedene Arten von Sperren für betroffene Objekte festlegen (Zeilen, Zeilengruppen, Indizes usw.). Es ist eine begrenzte Anzahl von Befehlen verfügbar, um Sperren (
SELECT FOR UPDATE
,LOCK
) manuell auszugeben . DML-Sperren können eskaliert werden (abhängig von RDMS, z. B. in SQLServer row-> page-> partition-> table). Sperren können auch von der Datenbank-Engine während des Verbindungsaufbaus, der Sicherung, Wiederherstellung, Prozedur / Trigger / Funktion / usw. beim Neukompilieren, Starten, Herunterfahren usw. ausgegeben werden.Ich bin nicht sicher, ob das Ihre Frage beantwortet, aber ich hoffe, dass es Sinn macht.
quelle
LOCK
oderSELECT FOR UPDATE
Anweisungen oder über einen anderen Mechanismus verwendet werden.BEGIN TRANSACTION
selbst keine Sperren. Nach DMLs in der Transaktion werden Sperren angezeigt.BEGIN TRANSACTION
selbst keine DML-Sperren erstellt werden. Es sollte tatsächlich einige interne Sperren ausgeben, da es Ressourcen zuweisen, einen Eintrag zurIch werde SQL Server-Jargon verwenden, aber die Konzepte sollten für andere Anbieter gleich sein:
Jeder Befehl, den Sie ausführen, wird innerhalb einer Transaktion ausgeführt. Diese Transaktion kann explizit mit BEGIN TRAN oder implizit vom Datenbankmodul geöffnet werden. Der Grund für das Öffnen einer impliziten Transaktion ist, dass die Engine weiterhin die ACID-Konformität und die Möglichkeit eines Rollbacks gewährleisten muss.
Wenn Sie ein SELECT FOR UPDATE ausführen, bedeutet dies lediglich, dass die Transaktion, während sie ausgeführt wird, eine bestimmte Sperre aufweist.
quelle
Sperre sind notwendig und sie machen die Datenbank. Dies verhindert, dass Daten beschädigt oder ungültig werden, wenn mehrere Benutzer versuchen zu lesen, während andere in die Datenbank schreiben. Die Transaktionsisolation wird normalerweise durch Sperren des Zugriffs auf eine Transaktion implementiert. Schlechte Designanwendungen nutzen das Datenbanksperrkonzept in großem Umfang :) !! Um dies zu vermeiden, konzentrieren Sie sich auf Ihr FK- und Datenlayout.
Es dreht sich alles um SÄURE: - Lies dies und es wird deinen Geist klären! ACID ist eine Reihe von Eigenschaften, die Sie beim Ändern einer Datenbank anwenden möchten.
Eine Transaktion besteht aus einer Reihe verwandter Änderungen, mit denen einige der ACID-Eigenschaften erzielt werden. Transaktionen sind Werkzeuge zum Erreichen der ACID-Eigenschaften.
Atomicity bedeutet, dass Sie garantieren können, dass eine Transaktion vollständig oder gar nicht stattfindet. Sie können komplexe Vorgänge als eine einzige Einheit ausführen, alles oder nichts, und ein Absturz, ein Stromausfall, ein Fehler oder etwas anderes führt dazu, dass Sie sich nicht in einem Zustand befinden, in dem nur einige der damit verbundenen Änderungen stattgefunden haben.
Konsistenz bedeutet, dass Sie garantieren, dass Ihre Daten konsistent sind. Keine der Einschränkungen, die Sie für verwandte Daten haben, wird jemals verletzt.
Isolation bedeutet, dass eine Transaktion keine Daten aus einer anderen Transaktion lesen kann, die noch nicht abgeschlossen ist. Wenn zwei Transaktionen gleichzeitig ausgeführt werden, sieht jeder die Welt so, als würden sie nacheinander ausgeführt, und wenn einer Daten lesen muss, die von einem anderen geschrieben wurden, muss er warten, bis der andere abgeschlossen ist.
Haltbarkeit bedeutet, dass nach Abschluss einer Transaktion garantiert wird, dass alle Änderungen auf einem dauerhaften Medium (z. B. einer Festplatte) aufgezeichnet wurden, und dass die Transaktion ebenfalls abgeschlossen wurde.
Transaktionen sind also ein Mechanismus, um diese Eigenschaften zu garantieren. Sie sind eine Möglichkeit, verwandte Aktionen zu gruppieren, sodass eine Gruppe von Operationen als Ganzes atomar sein, konsistente Ergebnisse liefern, von anderen Operationen isoliert und dauerhaft aufgezeichnet werden kann.
quelle
LOCK
Anweisungen verwenden kann, oder tun sie dies mit einem anderen Mechanismus?