Wie gehe ich mit gleichzeitigen Updates in Datenbanken um?

Wie wird mit gleichzeitigen Updates in einer SQL-Datenbank umgegangen?

Betrachten Sie ein einfaches SQL-Schema (Einschränkungen und Standardwerte nicht gezeigt ..) wie

create table credits (
  int id,
  int creds,
  int user_id
);

Die Absicht besteht darin, eine Art von Guthaben für einen Benutzer zu speichern, z. so etwas wie der Ruf von stackoverflow.

Wie gehe ich mit gleichzeitigen Aktualisierungen dieser Tabelle um? Ein paar Möglichkeiten:

update credits set creds= 150 where userid = 1;

In diesem Fall hat die Anwendung den aktuellen Wert abgerufen, den neuen Wert berechnet (150) und eine Aktualisierung durchgeführt. Was eine Katastrophe bedeutet, wenn jemand anderes zur gleichen Zeit dasselbe tut. Ich gehe davon aus, dass das Einschließen der Rückgabe des aktuellen Werts und das Aktualisieren in einer Transaktion das Problem lösen würde, z.Begin; select creds from credits where userid=1; do application logic to calculate new value, update credits set credits = 160 where userid = 1; end; In diesem Fall können Sie prüfen, ob das neue Guthaben <0 ist, und es einfach auf 0 kürzen, wenn negative Guthaben keinen Sinn ergeben.

update credits set creds = creds - 150 where userid=1;

In diesem Fall müssen Sie sich keine Gedanken über gleichzeitige Aktualisierungen machen, da sich die Datenbank um das Konsistenzproblem kümmert, jedoch den Fehler aufweist, dass creds möglicherweise negativ wird, was für einige Anwendungen möglicherweise keinen Sinn ergibt.

Was ist die akzeptierte Methode, um mit dem oben beschriebenen (recht einfachen) Problem umzugehen? Was ist, wenn die Datenbank einen Fehler auslöst?

Antworten auf die Frage(9)

Ihre Antwort auf die Frage