Seite 2 von 2

Verfasst: Donnerstag 22. November 2007, 18:34
von Y0Gi
Auf Kollisionen (mit vorhandenen Identifiern) muss ich ohnehin testen.

Meine o.g. Lösung ist *etwas*... kompakter als deine. Nimm's mir bitte nicht übel, wenn ich dabei bleibe ;)

Dein Beispiel ist dennoch hilfreich, wenn man einen bestimmten, evtl. eingeschränkten Zeichensatz benutzen möchte, danke.


Um zum Prüfen auf Kollisionen zurück zu kommen: Ich kann zwar eine Datenbank nach einem bestimmten Wert fragen und ihn, wenn dieser darin noch nicht vorhanden ist, einfügen. Allerdings ist nicht sichergestellt, dass nicht in der Zwischenzeit ein anderer Thread der Anwendung *(sehr, sehr) zufällig* auch diesen Wert erzeugt, abgefragt und eingefügt hat.

Wie lässt sich das verhindern? Ist ein `Lock`-Objekt eine gute Lösung (z.B. auch für das Erzeugen/ungestörte Einlesen/whatever von Dateien)? Würde es im Zusammenhang mit einer Datenbank evtl. zuviel Wartezeit verursachen und den Rest der Applikation ausbremsen?

Verfasst: Donnerstag 22. November 2007, 23:52
von mitsuhiko
Transaktionen nehmen und einen UNIQUE index auf das Feld.

Verfasst: Freitag 23. November 2007, 11:54
von Y0Gi
Urgs, Transaktionen, klar, danke.

Unique benutze ich natürlich schon. Hierzu wüsste ich bei der Gelegenheit jedoch gerne mal, wie man Datenbank-Exceptions z.B. durch Contraint-Überschreitungen sauber abfangen kann. Soweit ich weiß werfen die alle einen recht allgemeinen (SQLAlchemy-)Fehler, auf den sich schlecht reagieren lässt (und die Einbeziehung der Fehlermeldungen selbst ist mir zu riskant angesichts von Versionsänderungen).