[RUBY] [Rails] Ich habe versucht, eine Transaktion zu implementieren, die mehrere DB-Prozesse kombiniert

Einführung

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.

Was ist eine Transaktion?

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!

Verwendung der Transaktionsmethode

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.

Implementierung

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. スクリーンショット 2020-07-07 19.57.10.png

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.

  1. Erstellen Sie eine Gruppentabelleninstanz
  2. Erstellen Sie eine group_users-Tabelleninstanz

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

Schließlich

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.

Recommended Posts

[Rails] Ich habe versucht, eine Transaktion zu implementieren, die mehrere DB-Prozesse kombiniert
Ich habe versucht, eine Web-API zu erstellen, die mit Quarkus eine Verbindung zur Datenbank herstellt
Ich habe versucht, einen Server mit Netty zu implementieren
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen
[Rails] Ich habe versucht, die Stapelverarbeitung mit der Rake-Task zu implementieren
Ich habe versucht, eine Webanwendung voller Fehler mit Kotlin zu implementieren
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe versucht, eine einfache Anwendung mit Dockder + Rails Scaffold zu erstellen
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Ich habe versucht, das Iterator-Muster zu implementieren
So implementieren Sie eine Diashow mit Slick in Rails (einzeln und mehrfach nacheinander)
Rails-API-Modus Ich habe versucht, die Mehrfachsuchfunktion für Schlüsselwörter mithilfe von Arrays und iterativer Verarbeitung zu implementieren.
Ich habe versucht, CentOS-7 einfach in einen PC zu integrieren, den ich nicht mehr benötige
Ich habe versucht, polymorph in Nogizaka zu implementieren.
[Erste Umgebungskonstruktion] Ich habe versucht, eine Rails6 + MySQL8.0 + Docker-Umgebung unter Windows 10 zu erstellen.
Ich habe versucht, mit HCE-F von Android eine Funktion zu implementieren, die Felica Lite entspricht
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Ich habe versucht, die Sitzung in Rails zu organisieren
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe versucht, ein Personalmanagement-Tool zu entwickeln
Ich habe versucht, eine Website für das Studium von DUO3.0 zu entwickeln.
Ich habe versucht, eine LINE-Klon-App zu erstellen
So implementieren Sie eine ähnliche Funktion in Rails
Ich habe versucht, eine Website zu entwickeln, um Ausgaben zu erfassen.
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe versucht, mit Wercker ein Docker-Image zu erstellen und zu veröffentlichen, mit dem GlassFish 5 gestartet wird
Ich habe versucht, eine Nachrichtenfunktion der Rails Tutorial-Erweiterung (Teil 1) zu erstellen: Erstellen Sie ein Modell
Ich möchte PowerMock in einer Klasse verwenden, die parametrisierte Tests und gewöhnliche Tests kombiniert
Eine Geschichte, nach der ich süchtig war, als ich einen Schlüssel bekam, der automatisch auf MyBatis ausprobiert wurde
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren
So implementieren Sie eine nette Funktion in Ajax mit Rails
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
Ich habe versucht, eine Ramen-Shop-Sharing-Website zu entwickeln.
Ich möchte ein kleines Symbol in Rails verwenden
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich möchte eine Funktion in der Rails Console definieren
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
Rails6 Ich habe versucht, Docker in eine vorhandene Anwendung einzuführen
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
[Rails 6.0, Docker] Ich habe versucht, die Konstruktion der Docker-Umgebung und die zum Erstellen eines Portfolios erforderlichen Befehle zusammenzufassen
[Java] Ich habe versucht, ein Janken-Spiel zu erstellen, das Anfänger auf der Konsole ausführen können
Ich habe versucht, eine Nachrichtenfunktion für die Erweiterung Rails Tutorial (Teil 2) zu erstellen: Erstellen Sie einen Bildschirm zum Anzeigen
Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, TabLayout unter Android eine Trennlinie hinzuzufügen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
Ich möchte eine Produktinformationsbearbeitungsfunktion ~ part1 ~ implementieren