Django ORM und Sperrtabelle

9

Mein Problem ist wie folgt:

Ich habe einen Autohändler A und eine db-Tabelle namens sold_cars . Wenn ein Auto verkauft wird, erstelle ich einen Eintrag in dieser Tabelle.

Tabelle hat eine ganzzahlige Spalte namens order_no . Es sollte innerhalb der vom Händler verkauften Autos einzigartig sein.

Wenn also Händler A Autos a, b and c verkauft hat, sollte diese Spalte 1, 2, 3 sein. Ich muss diese Spalte verwenden, und nicht einen Primärschlüssel, weil ich keine Löcher in meiner Nummerierung haben möchte - Händler A und B (die später hinzugefügt werden) sollten Ordnungsnummern 1, 2, 3 und nicht A haben : 1, 3, 5, und B: 2, 4, 6. Also ... wähle ich die letzte bestmögliche order_no für einen gegebenen Dealer, inkrementiere sie um 1 und speichere.

Problem ist, dass zwei Leute das Auto von Händler A in derselben Millisekunde gekauft haben und beide Bestellungen die gleiche order_no bekommen haben. Irgendein Rat? Ich dachte daran, diesen Prozess in einem Transaktionsblock zu schließen und diese Tabelle zu sperren, bis die Transaktion abgeschlossen ist, kann aber keine Informationen dazu finden.

    
Marek M. 30.10.2013, 14:51
quelle

2 Antworten

6

Ich denke, dass dieses Code-Snippet Ihren Anforderungen entspricht, vorausgesetzt, Sie verwenden MySQL. Wenn nicht, müssen Sie möglicherweise die Syntax ein wenig optimieren, aber die Idee sollte noch funktionieren.

Quelle: Tabellen sperren

%Vor%     
st0ne 21.02.2014, 11:10
quelle
12

Ich weiß, dass diese Frage etwas älter ist, aber ich hatte gerade das gleiche Problem und wollte meine Erkenntnisse teilen.

Ich war nicht ganz zufrieden mit der Antwort von st0nes, da (zumindest für Postgres) eine LOCK TABLE -Anweisung nur innerhalb einer Transaktion ausgegeben werden kann. Und obwohl in Django normalerweise fast alles innerhalb einer Transaktion passiert, stellt dieser LockingManager nicht sicher, dass Sie tatsächlich in einer Transaktion sind, zumindest nach meinem Verständnis. Außerdem wollte ich die Models Manager nicht komplett ändern, nur um sie an einer Stelle sperren zu können. Daher suchte ich eher nach etwas, das ähnlich wie with transaction.atomic(): funktioniert, sperrt aber auch ein bestimmtes Model.

Also kam ich auf folgendes:

%Vor%

Wenn ich nun das Modell ModelToLock sperren möchte, kann dies wie folgt verwendet werden:

%Vor%

EDIT: Beachten Sie, dass ich dies nur mit Postgres getestet habe. Aber zu meinem Verständnis sollte es auch auf mysql genau so funktionieren.

    
jdepoix 24.01.2017 14:43
quelle

Tags und Links