0

Ich habe ein Modell, das eine HTTP-Anfrage an einen externen Web-Service bei der Erstellung sendet, um einige Informationen vor dem Speichern zu finden.HTTP-Anfragen in Transaktionen?

Derzeit mache ich dies in einem before_create Rückruf. Ich habe kürzlich gelernt, dass vor/nach Callbacks happen within database transactions.

Bin ich offen für alle Probleme wie DB-Durchsatz zu begrenzen, indem Sie dies tun? Wäre es besser, den Datensatz vor dem Senden der http-Anfrage zu committen und dann den Datensatz bei der Rückkehr zu aktualisieren?

Antwort

1

Solange eine Transaktion geöffnet ist, sind alle von ihr erfassten Sperren aktiv. Wenn Sie einen Anruf bei einer externen Quelle haben, die Sie für längere Zeit blockieren kann, müssen Sie sicherstellen, dass in derselben Transaktion keine nicht verwandten Sperren vorhanden sind.

Mit anderen Worten: Legen Sie nichts anderes in die gleiche Transaktion.

Wenn es Ihnen nichts ausmacht, dass die neue Zeile sichtbar ist, bevor Sie die zusätzlichen Informationen nachschlagen, können Sie die Zeile einfach festschreiben und später aktualisieren.

Oder Sie holen die Informationen aus dem externen Web-Service, bevor Sie sogar die Transaktion starten. Das wäre die sauberste/schnellste Lösung für die Datenbank.

PostgreSQL lock types.
How to view locks.