Wenn Sie Oracle glauben, nein, überhaupt nicht. Das liegt daran, dass Oracle große Anstrengungen unternommen hat, um es zu vermeiden.
Das Problem ist, dass die Leser blockieren können, Autoren und Autoren blockieren Leser, und ein Schriftsteller muss warten, bis alle Leser mit einer Zeile fertig sind, bevor es schreiben kann. Das verzögert den Schreibvorgang und seinen Aufrufer. Exklusive Sperren (zum Schreiben) werden am Ende der Transaktion gehalten, für den Fall, dass die Transaktion zurückgesetzt werden muss - dies stoppt, dass andere Transaktionen den neuen Wert sehen, bis die Transaktion festgeschrieben wird.
In der Praxis ist das Sperren im Allgemeinen gut, wenn nicht zu viele Konflikte auftreten, wie bei jeder gleichzeitigen Programmierung. Wenn es zu viele Konflikte für eine Zeile/Seite/Tabelle gibt (nicht viele Datenbankserver sperren die gesamte Datenbank), führt dies dazu, dass die Transaktionen nacheinander und nicht gleichzeitig ausgeführt werden.
Oracle verwendet die Zeilenversionsverwaltung. Statt eine Zeile zu sperren, um sie zu schreiben, wird stattdessen eine neue Version der Zeile erstellt.Leser, die ihre Lesevorgänge wiederholen müssen, merken sich, welche Version der Zeile sie lesen. Ein Fehler tritt jedoch auf, wenn ein Leser, der sich an seine Lesevorgänge erinnert, versucht, eine Zeile zu aktualisieren, die von einem anderen Schreiber aktualisiert wurde, da diese Transaktion ihn gelesen hat. Dies ist, um verlorene Updates zu stoppen. Um sicherzustellen, dass Sie eine Zeile aktualisieren können, müssen Sie sagen, dass SELECT für UPDATE ist; Wenn Sie dies tun, dauert es eine Sperre - nur eine Transaktion kann eine Zeile für UPDATE zu einer Zeit enthalten, und eine in Konflikt stehende Transaktion muss warten.
SQL Server 2005 und höher unterstützen die Snapshot-Isolierung, was ihr Name für Zeilenversionsverwaltung ist. Auch hier sollten Sie nach Update-Sperren fragen, wenn Sie einige gerade gelesene Daten aktualisieren müssen - verwenden Sie in SQL Server WITH (UPDLOCK).
Ein weiteres Problem beim Sperren ist die Wahrscheinlichkeit von Deadlocks. Dies ist einfach, wenn zwei Transaktionen jeweils eine Sperre für eine Ressource halten, die die andere benötigt, oder im Allgemeinen ein Zyklus von Transaktionen Sperren hält, die sich gegenseitig fortführen müssen. Der Datenbankserver erkennt diesen Deadlock im Allgemeinen und beendet eine der Transaktionen, indem er sie zurücksetzt. Anschließend müssen Sie den Vorgang erneut versuchen. Jede Situation, in der Sie mehrere gleichzeitige Transaktionen haben, die dieselben Zeilen ändern, hat das Potenzial für Deadlock. Der Deadlock wird auftreten, wenn die Zeilen in einer anderen Reihenfolge berührt werden; Es ist sehr schwierig, die Reihenfolge zu erzwingen, die der Datenbankserver verwenden wird (im Allgemeinen sollte der Optimierer die schnellste Reihenfolge auswählen, die bei verschiedenen Abfragen nicht unbedingt konsistent ist).
Im Allgemeinen würde ich das gleiche wie mit Threading vorschlagen - gehen Sie mit Sperren, bis Sie beweisen können, dass sie ein Problem Skalierbarkeit verursachen, dann erarbeiten, wie Sie die wichtigsten Abschnitte sperren-frei machen.
Code, der Gleichzeitigkeit "nativ" behandeln kann ... irgendeinen Vorschlag wie? – Graviton
Ich denke, er meint die Verwendung der Funktionen der Programmiersprache oder Bibliothek wie java.util.concurrent. –
Ja. Siehe auch http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html – Rolf