2017-07-13 3 views
0

Ich verwende Transaktion, um Hotelmodell zu speichern. Hier ist ein Code:Eindeutigkeitsprüfung mit Transaktion

def init 
    Hotel.transaction do 
    @hotel.save! 
    create_related_models 
    end 
end 

Ich habe Einzigartigkeit Validierung auf :name im Hotel. Validierung ist keine Arbeit innerhalb der Transaktion. Wie können datenbankbezogene Validierungen innerhalb einer Transaktion implementiert werden?

Erläuterung warum die Validierung nicht funktioniert.

Wenn ein Benutzer ein Formular abschickt, dauert die Anfrage etwa 10 Sekunden. Wenn er während der Anfrage ein anderes Mal auf Speichern klickt, speichert er zwei Hotels mit demselben Namen (was ein Problem ist). Dies liegt daran, dass die erste Transaktion nicht abgeschlossen wurde, wenn eine andere Transaktion gestartet wurde. Also, wenn ein anderer dort starten ist kein Hotel in der Datenbank so Validierung return true

Antwort

1

Sie müssen entweder:

  1. eine Datenbank Einschränkung Dieses Verhalten zu verhindern, und zu fangen und einen Fehler behandeln. Die Anwendung kann keine Sichtbarkeit von nicht festgeschriebenen RDBMS-Transaktionen haben. Nur die Datenbank kann das tun.
  2. Fügen Sie in der Anwendung einen Sperrmechanismus hinzu, der schwierig sein wird, wenn Sie mehrere Threads (Heroku-Dynas?) Ausführen.
  3. Reduzieren Sie die Zeit für die Transaktion erheblich.
  4. Verschieben Sie die Erstellung der verwandten Modelle außerhalb der Transaktion, und bieten Sie einen Mechanismus zum manuellen Löschen des Hoteleintrags ist ein Problem während der Ausführung auftritt.
  5. Entfernen Sie die Eindeutigkeitsprüfung.
+0

Ich wollte Sperrmechanismus hinzufügen, aber es erwies sich als zu schwierig. Danke für die Lösung. Zur Zeit habe ich Javascript Button hinzugefügt, aber ich werde auch Ihre erste Lösung implementieren (Constrain und Fehler behandeln) –

Verwandte Themen