Heim >Java >Gibt es eine Lösung, um dieselben/ähnlichen Datenbankoperationen gleichzeitig über mehrere Threads auszuführen?

Gibt es eine Lösung, um dieselben/ähnlichen Datenbankoperationen gleichzeitig über mehrere Threads auszuführen?

WBOY
WBOYnach vorne
2024-02-22 12:31:06667Durchsuche

Java-Fragen und Antworten von PHP-Editor Zimo: Gibt es eine Lösung, die es mehreren Threads ermöglicht, dieselben/ähnlichen Datenbankoperationen gleichzeitig auszuführen? Während des Entwicklungsprozesses hat die Frage, wie man mehrere Threads, die die Datenbank gleichzeitig betreiben, effektiv handhaben kann, immer große Aufmerksamkeit erregt. In diesem Artikel werden verschiedene Lösungen vorgestellt, darunter die Verwendung von Datenbankverbindungspools, Sperrmechanismen, Transaktionsverarbeitung und anderen Methoden, um Entwicklern bei der Lösung dieses Problems zu helfen. Lassen Sie uns untersuchen, wie Sie gleichzeitige Multithread-Datenbankoperationen implementieren können, um die Systemleistung und -stabilität zu verbessern.

Frageninhalt

Gibt es unter Verwendung von Java, Spring Boot und Hibernate eine Möglichkeit, mehreren Threads die gleichzeitige Ausführung eines bestimmten Vorgangs zu ermöglichen, ohne Deadlocks oder Ausnahmen aufgrund veralteter Daten zu verursachen?

Angenommen, das automatisierte Tool meldet sich zweimal gleichzeitig an, was zu einer der folgenden Situationen führt:

  1. Deadlock, weil zwei Threads (Anfragen) Benutzerdatensätze gleichzeitig aktualisieren, z. B. das Datum/die Uhrzeit der letzten Anmeldung des Benutzers.
  2. Ausnahme aufgrund veralteter Daten, da ein Thread den Benutzer aktualisiert hat, bevor die Transaktion eines anderen Threads abgeschlossen wurde.

Dies könnte durch Hinzufügen einer Synchronisierung der Benutzer-ID gelöst werden, aber so etwas müsste überall passieren, was zu potenziellen Leistungseinbußen führen und die Codebasis aufgeblähter und schwieriger zu pflegen machen würde.

Alternativ können wir die Isolationsstufe anpassen (vielleicht können wir die Standardstufe global festlegen). Ist das eine bessere Lösung oder gibt es andere Lösungen?

Lösung

Pessimistische Sperre.

Sperren Sie alle Zeilen, die möglicherweise zu Beginn der Transaktion aktualisiert werden müssen. Sie können dies mit Locking Read tun.

select ... from users where user_id = ? for update;

Nur ein Thread wird es schaffen. Andere Threads warten darauf, dass dieser Thread die Sperre aufhebt.

In der Zwischenzeit kann der Thread, der die Sperre hält, die Zeile aktualisieren, wenn er bereit ist.

update users set last_login = now() where user_id = ?;

Dann reichen Sie aus Höflichkeit gegenüber anderen Threads bitte so schnell wie möglich nach update ein. Dadurch wird die Sperre automatisch aufgehoben.

COMMIT;

Dadurch kann der nächste Thread in der Warteschlange die Sperre erhalten, auf die er wartet.

Sie können Sperrlesevorgänge verwenden, um mehrere Zeilen zu sperren, sogar mehrere Zeilen in mehreren Tabellen. select Alle von der Abfrage überprüften Zeilen werden gesperrt. Wenn Sie Zeilen in mehreren Tabellen sperren müssen, können Sie Vorgänge wie Joins ausführen.

Die Sperrenerfassung ist atomar, daher muss eine bestimmte Sperranweisung alle angeforderten Sperren erwerben, andernfalls muss sie warten.

Das obige ist der detaillierte Inhalt vonGibt es eine Lösung, um dieselben/ähnlichen Datenbankoperationen gleichzeitig über mehrere Threads auszuführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen