2017-05-13 4 views
2

Ich habe eine Zeile mit einem Integer-Wert, es gibt viele gleichzeitige Anfragen in dieser Zeile, ich möchte, dass jede Leseoperation von einer Aktualisierungsoperation (Inkrement) gefolgt wird, und die Daten konsistent zu halten, nur eine Anfrage kann lesen > gleichzeitig aktualisieren. Ich habe ein paar Nachforschungen gemacht und herausgefunden, die select_for_update(), und ich dachte auch an einen Trigger auf SELECT, um den Wert zu erhöhen, nachdem es ausgewählt ist, ist die Frage .. Wird das funktionieren, wie ich annehme ?

Arbeitet der Trigger parallel oder ist er konsistent?MySQL select_for_update() und löst aus .. wie funktioniert das Blockieren?

Antwort

1

Der Django select_for_update ist ein Wrapper für die select ... for update Funktion in den meisten gängigen Datenbanken (Postgres, Mysql, Oracle ...), die im Grunde die ausgewählten Zeilen gegen gleichzeitige Updates sperrt.

PostgreSQL docs

MySQL docs

Sie müssen die Sperre in eine Transaktion wickeln, so wird der Zugang gesperrt werden, bis die Ausführung der Transaktion endet.

+0

Wenn ich eine Transaktion mit transcation.atomic() öffne und select_for_update() innerhalb der transaction.atomic() -Anweisung verwende, werden die Zeilen bis zur allerletzten Zeile des transaction.atomic() Blocks gesperrt? – Kareem

+0

Ja, alle übereinstimmenden Zeilen werden bis zum Ende des Transaktionsblocks gesperrt. Sie können dieses Verhalten testen, indem Sie einen Zeitschlaf in den Transaktionsblock einfügen und versuchen, die Zeilen zu aktualisieren, während sich die Ausführung noch im Block befindet. –

+0

Vielen Dank :) – Kareem

Verwandte Themen