Wenn ich eine Datenbanktransaktion zum Gruppieren mehrerer Aktualisierungen verwende, sollte ich auch SELECTs in die Transaktion aufnehmen? Zum Beispiel können, sage ich:Sollte ich SELECTs in eine Transaktion aufnehmen?
- einen Rekord für diesen Datensatz
- Prüfung bearbeiten Berechtigungen erhalten, Daten aus dem Datensatz
- Update einige Datensätze
- Update einige andere Aufzeichnungen
mit Sollte ich die Transaktion vor dem "get a record" -Stadium starten oder nur um die Updates herum?
Ich benutze Postgres/Django transaction.atomic()
, aber ich denke nicht, dass es hier zählt.
Ein Hinweis für Django Benutzer: SELECT ... FOR UPDATE' ist über Djangos 'select_for_update' (https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.select_for_update) –
@ScottStafford ... aber leider nicht 'SELECT ... FOR SHARE' oder PostgreSQL' SELECT ... FOR KEY SHARE'/'KEY UPDATE'. –
Also, um sicherzustellen, dass ich mit dem Django-Winkel folge, wird ein Aufruf wie 'MyObject.objects.get (pk = 5)' nichts sperren, egal ob in einem 'transaction.atomic()' oder nicht. Um dies zu tun, muss ich beide innerhalb einer 'transaction.atomic()' UND verwenden Sie ein Formular wie 'MyObject.objects.select_for_update(). Get (pk = 5)', um sicherzustellen, dass MyObject 5 nicht geändert werden kann, bis danach Meine Transaktion endet. –