Ich habe eine App mit Rails entwickelt und den Prozess des Erstellens von Daten für mehrere Tabellen gleichzeitig implementiert. In diesem Prozess habe ich gelernt, dass es ein Transaktionskonzept gibt, bei dem beide Prozesse fehlen, wenn einer der beiden Prozesse fehlschlägt. Daher werde ich über die Transaktion und die als Memorandum und Ausgabe implementierten Inhalte schreiben.
Nachschlagen der Definition des Wortes "Transaktion" [Verarbeitung, Handhabung, Behandlung, Geschäft, Handel, Kauf und Verkauf, Newsletter, Bulletin, Protokoll] Es kommt so heraus.
In IT und Programmierung "Unteilbare Dinge, die mehrere Prozesse zu einem kombinieren"
Es scheint, dass es definiert werden kann als.
Dieser Artikel ist eine sehr leicht verständliche Zusammenfassung des Transaktionskonzepts, und ich habe ihn als Referenz verwendet.
Was ist eine "Transaktion"? Ich habe versucht, auf super einfache Weise darüber zu sprechen!
Die grundlegende Syntax ist wie folgt
Modell-.transaction do
#Tabellenzugriffsverarbeitung
#Tabellenzugriffsverarbeitung
end
#Verarbeitung bei erfolgreicher Transaktionsverarbeitung
rescue => e
#Verarbeitung, wenn die Transaktionsverarbeitung fehlschlägt
Verwenden Sie als Einschränkung "eine Methode, die eine Ausnahme auslöst, wenn die Verarbeitung fehlschlägt".
Wenn eine Transaktion in einem der enthaltenen Prozesse fehlschlägt, wird davon ausgegangen, dass nicht alle Prozesse in der Transaktion ausgeführt wurden. Die Bedingung dafür ist jedoch, dass "eine Ausnahme aufgetreten ist".
Lassen Sie es uns tatsächlich implementieren.
Die App, die wir dieses Mal entwickelten, hatte eine Benutzergruppierungsfunktion. Daher wird davon ausgegangen, dass der Benutzer, der die Gruppe erstellt hat, beim Erstellen einer neuen Gruppe automatisch der Benutzer wird, der zur Gruppe gehört. Erwägen Sie daher beim Erstellen einer Gruppe die Verwendung einer Transaktion, um unerwartetes Verhalten zu vermeiden.
Die Tabellenstruktur ist wie folgt.
Gleichzeitig mit dem Erstellen der Gruppentabelleninstanz wollte ich eine group_users-Tabelle (Zwischentabelle zwischen der Benutzertabelle und der Gruppentabelle) mit der ID des angemeldeten Benutzers als Spalte user_id erstellen.
Wenn einer dieser Prozesse 1 und 2 aus irgendeinem Grund fehlschlägt, wird die Transaktion in der Erstellungsaktion des Gruppencontrollers verwendet, sodass beide Prozesse nicht verarbeitet wurden.
groups_controller.rb
#Auszug aus dem Aktionsteil erstellen
#Variabler Strom_Benutzer enthält eine Instanz des angemeldeten Benutzers
def create
@group = Group.new(group_params)
#Transaktion anwenden(Erstellen Sie gleichzeitig eine Gruppe und eine Zwischentabelle)
# save!Und schaffen!Wann"!Bitte beachten Sie, dass "" beigefügt ist!
@group.transaction do
@group.save!
current_user.group_users.create!(group_id: @group.id, permission: true)
end
#Verarbeitung bei erfolgreicher Transaktion
flash[:success] = 'Neue Gruppe erstellt'
redirect_to @group
rescue => e
#Verarbeitung, wenn eine Transaktion fehlschlägt
flash.now[:danger] = 'Gruppenerstellung fehlgeschlagen'
render :new
end
Beachten Sie, dass beide Prozesse in dieser Transaktion mit einem "!" Gekennzeichnet sind. Verwenden Sie eine Methode, die eine Ausnahme auslöst, wenn die Erstellung von Tabellendaten fehlschlägt!
Wenn das Folgende ohne Verwendung einer Transaktion implementiert wird, besteht die Sorge, dass eine unbemannte Gruppe erstellt wird, wenn die Erstellung der Tabelle group_users aus irgendeinem Grund fehlschlägt.
groups_controller.rb
#Wenn Sie keine Transaktion verwenden
def create
@group = Group.new(group_params)
if @group.save
current_user.group_users.create(group_id: @group.id, permission: true)
flash[:success] = 'Neue Gruppe erstellt'
redirect_to @group
else
flash.now[:danger] = 'Gruppenerstellung fehlgeschlagen'
render :new:
end
end
Vielen Dank für das Lesen des Artikels! Ich habe es geschafft, es während der Untersuchung dieses Mal umzusetzen, aber ehrlich gesagt habe ich kein tiefes Verständnis für Transaktionen. Wenn Sie Fehler oder bessere Beschreibungsmethoden haben, können Sie diese gerne kommentieren. Ich habe den folgenden Artikel als Referenz verwendet. Vielen Dank.