Begriff für Aktionen, die keine Transaktionen speichern


7

Wenn Sie sich nur die Datenbank ansehen, ist alles in Ordnung. Sie haben Transaktionen und wenn etwas schief geht, wird alles zurückgesetzt. Das ist schön - ich mag das.

ABER: Ich möchte Mails senden. Jetzt bin ich in Schwierigkeiten, weil ich nicht zurückrollen kann.

Beispiel:

  1. Transaktion beginnt
  2. Mail wird gesendet
  3. Andere Dinge werden erledigt (innerhalb der DB)
  4. Etwas läuft schief.
  5. Rollback.

Wie man das löst, ist eine andere Frage, nicht diese.

Diese Frage, wie man das allgemein nennt. In diesem Beispiel geht es um das Versenden von E-Mails. Aber das gleiche Problem, sobald Sie etwas in Systemen ändern, die außerhalb der Transaktionsgrenze liegen.

Gibt es einen Namen für dieses Problem ?

Etwa das gleiche Problem tritt auf, wenn Sie Dateien aus einem Verzeichnis importieren möchten. Wenn Sie die Datei innerhalb der Transaktion löschen, schlägt die Transaktion möglicherweise fehl und die Datei wurde gelöscht, aber nie importiert. Oder Sie löschen die Datei nach der Transaktion. Dann schlägt das Löschen der Datei möglicherweise fehl und die Datei wird ein zweites Mal importiert.

Ich möchte keine Lösung dafür neu erfinden. Deshalb brauche ich den passenden Begriff für dieses Problem. Dann kann ich einige Artikel lesen und erfahren, was "Stand der Technik" im Jahr 2018 ist.


Ich denke, der Begriff, den Sie suchen, ist "Nebenwirkung".
Hunterjrj

@hunterjrj Ich habe versucht, nach "Nebeneffekt postgresql" zu suchen, aber die ersten Suchergebnisse stimmten nicht überein.
Guettli

Antworten:


1

Sie beschreiben eine verteilte Transaktion . Beachten Sie, dass der Begriff "Transaktion" eine allgemeinere Bedeutung hat als nur "Datenbanktransaktion".

In einer verteilten Transaktion haben verschiedene Mitglieder möglicherweise unterschiedliche ACID-Eigenschaften (z. B. muss die Zustellung von E-Mails nicht unbedingt garantiert werden), unterschiedliche Ansätze zum Erreichen dieser Eigenschaften und unterschiedliche Fehlerszenarien.

Um die Konsistenz einer verteilten Transaktion sicherzustellen, wird normalerweise eine externe Entität namens Transaktionskoordinator (oder -manager) eingesetzt, um das Engagement jedes Mitglieds zu steuern (kann auch als Ressource oder Ressourcenmanager bezeichnet werden). Eine übliche Methode ist das Two-Phase-Commit (2PC).

Wenn Sie im Internet nach "Konsistenz in verteilten Systemen" suchen, finden Sie eine Vielzahl von Materialien zu diesem Thema.


Vielen Dank für "Konsistenz in verteilten Systemen". Ich denke, dieser Begriff passt sehr gut zusammen.
Guettli

6

Das Oracle PL / SQL-Schlüsselwort AUTONOMOUS_TRANSACTIONbewirkt, dass eine Prozedur eine weitere Sitzung erstellt, eine Transaktion ausführt, nur diese private Transaktion festschreibt / zurücksetzt und die Flusskontrolle an das übergeordnete Element zurückgibt.

Oh ... senden Sie niemals E-Mails mit nicht festgeschriebenen Daten.

BEARBEITEN: (aufgrund der Bearbeitung des ursprünglichen Beitrags)

Etwa das gleiche Problem tritt auf, wenn Sie Dateien aus einem Verzeichnis importieren möchten. Wenn Sie die Datei innerhalb der Transaktion löschen, schlägt die Transaktion möglicherweise fehl und die Datei wurde gelöscht, aber nie importiert. Oder Sie löschen die Datei nach der Transaktion. Dann schlägt das Löschen der Datei möglicherweise fehl und die Datei wird ein zweites Mal importiert.

Diese Art von Problem wird als a bezeichnet bug.

Die Lösung ist:

  • Definieren Sie jeden Schritt als seinen eigenen TRANSACTION
    • Sie möchten sie so erstellen, dass Sie die Schritte nach Bedarf erneut ausführen (oder überspringen) können
  • Führen Sie jeden Schritt in der entsprechenden Reihenfolge aus.
    • Senden Sie keine E-Mails vor COMMIT.
    • Löschen Sie keine Datei vor dem erfolgreichen Laden der Daten
  • Sie müssen nachverfolgen, wo Sie sich gerade befinden und ob dieser Schritt erfolgreich war oder nicht.

E-MAIL-Beispiel

Sie sollten eine Prozedur haben, nach sendEmailder aufgerufen werden sollte commit.

Wenn Sie die Prozedur vorher aufrufen möchten commit, müssen Sie einer Warteschlange, die rollbackdie Haupttransaktion enthält , eine Zeile hinzufügen . Für Oracle ist dies entweder Advance Queuingoder das PaketAPEX_MAIL

Wenn Sie es in ein separates Verfahren einfügen, können Sie es sendEmailauf Anfrage des [Endbenutzers] ein zweites Mal tun.

Datei verarbeiten

Sie haben einen Algorithmus, der einige Schritte enthält, bei denen jeder Schritt fehlschlagen kann. Das ist eigentlich anders als dein sendEmailProblem.

Sie müssen aufzeichnen, was Sie verarbeiten, wo Sie sich in Ihrem Algorithmus befinden und ob dieser Schritt erfolgreich war oder fehlgeschlagen ist.

Um einen Fehler in einem beliebigen Schritt zu beheben, muss jeder Schritt des Prozesses als diskret definiert werden TRANSACTION.

In Oracle hätte ich folgende Prozeduren (1 Prozedur pro TRANSACTION):

create or replace
package file_processing_package
as
  procedure update_file_processing_status(
                                p_id       IN files_to_process.id%TYPE
                              , p_status   IN process_states.id%TYPE);


  function add_a_file_to_be_processed( p_filename IN files_to_process.file_name%TYPE )
                               return files_to_process.id%TYPE;

  procedure load_data_from_file( p_id in files_to_process.id%TYPE );

  procedure process_already_loaded_data( p_id in files_to_process.id%TYPE );

  procedure delete_file_from_os( p_id in files_to_process.id%TYPE );
end;
/

Dies basiert auf den folgenden Tabellen:

CREATE TABLE PROCESS_STATES (
  id   int generate by default on null as identity, -- 12c+
  state_desc  varchar2(25) not null,
  constraint process_states_pk primary key (id),
  constraint process_states_uq1 unique (state_desc)
);

insert into process_states( state_desc ) values ( 'file to be processed' );
insert into process_states( state_desc ) values ( 'file loaded' );
insert into process_states( state_desc ) values ( 'processing' );
insert into process_states( state_desc ) values ( 'processing failed' );
insert into process_states( state_desc ) values ( 'processing succeeded' );
insert into process_states( state_desc ) values ( 'delete failed' );
insert into process_states( state_desc ) values ( 'OK' ); -- delete succeeded
commit;

CREATE TABLE FILES_TO_PROCESS (
  id               int generate by default on null as identity, -- 12c+
  file_name        varchar2(50) not null,
  process_state_id int not null,
  constraint file_to_process_pk  primary key (id),
  constraint file_to_process_uq1 unique (file_name),
  constraint file_to_process_fk1 foreign key (process_state_id)
                            references (process_states.id)
);

Die UNIQUEEinschränkung für FILE_NAMEverhindert, dass dieselbe Datei zweimal verarbeitet wird.


Der Name für dieses Problem ist "autonome Transaktion"?
Guettli

Ich denke, diese Antwort passt nicht zur Frage. Vielen Dank, dass Sie die Anwendungsfälle der Frage lösen möchten, aber darum ging es nicht. Ich habe nach einem passenden Begriff gesucht, um mehr über das allgemeine Problem zu erfahren.
Guettli

3

Ich denke, vielleicht ist der Begriff, den Sie suchen, schmutzig gelesen :

Ein Dirty Read (auch als nicht festgeschriebene Abhängigkeit bezeichnet) tritt auf, wenn eine Transaktion Daten aus einer Zeile lesen darf, die von einer anderen laufenden Transaktion geändert und noch nicht festgeschrieben wurde. [...]

In unserem Beispiel ändert Transaktion 2 eine Zeile, schreibt die Änderungen jedoch nicht fest. Transaktion 1 liest dann die nicht festgeschriebenen Daten. Wenn Transaktion 2 seine Änderungen zurücksetzt (die bereits von Transaktion 1 gelesen wurden) oder andere Änderungen an der Datenbank aktualisiert, ist die Ansicht der Daten in den Datensätzen von Transaktion 1 möglicherweise falsch.


1

Was Sie beschreiben, ist der Wunsch nach einer verteilten Transaktion, nur dass Sie keinen verteilten Transaktionsmanager und keine Rollback-Möglichkeit haben. Am einfachsten ist es, die Warteschlange (extern) oder den SQL Server-Broker zu verwenden, um die Schleife vom eigentlichen Sendevorgang zu entkoppeln. Siehe zum Beispiel: http://python-rq.org/


1

Ich habe keinen bestimmten Begriff für die tatsächliche Kombination des Aufrufs eines externen Prozesses aus einer Datenbanktransaktion, aber ich würde dieses Problem als eng gekoppelt klassifizieren .

Das Hauptproblem besteht darin, dass Sie das Senden der E-Mail eng mit der Datenbanktransaktion verknüpft haben .

Eine Lösung für dieses Problem besteht darin, sie lose zu koppeln .

Technisch könnte man dies auf viele Arten lösen, in grober Reihenfolge von hässlich bis nett:

  • Ein Flag in den Zeilen in der Tabelle zeigt an, ob eine E-Mail gesendet wurde oder nicht. Ein externer Prozess kann nach Flags suchen und E-Mails senden.
  • Generieren und speichern Sie die E-Mails in einer Tabelle. Diese werden dann begehen in der gleichen Transaktion. Ein externer Prozess liest und sendet E-Mails, die gesendet werden müssen. Die Überwachung der Tabelle kann durch Abfragen oder mit einem Listen / Notify-Konstrukt erfolgen (siehe weiter unten).
  • Verwenden Sie ein Listen / Notify-Konstrukt (Postgres-Implementierung). Die Datenbanktransaktion ruft NOTIFY auf. Ein LISTENing-Prozess, der kontinuierlich ausgeführt wird, wird benachrichtigt, wenn die Transaktion festgeschrieben wird, wodurch die gewünschte Isolation und die lose Kopplung bereitgestellt werden .

0

Implizite Commits

Ich glaube, das ist der Begriff, den Sie suchen. Dies sind Aussagen, die nicht eingehalten werden / können und werdenTransactions

Orakel

MySQL

SQL Server

Datenbank-ddls-und-implizites Festschreiben

und am interessantesten Dies:

sp_send_dbmail (Transact-SQL)

Wenn sp_send_dbmail ohne Transaktionskontext ausgeführt wird, startet Database Mail und schreibt eine implizite Transaktion fest. Wenn Sie sp_send_dbmail aus einer vorhandenen Transaktion heraus ausführen, verlässt sich Database Mail darauf, dass der Benutzer Änderungen festschreibt oder zurücksetzt. Es wird keine innere Transaktion gestartet.

Der Workflow braucht nur Aufmerksamkeit,

Anstatt

  • Transaktion startet
  • Mail wird gesendet
    • Andere Dinge werden erledigt (innerhalb der DB)
      • Etwas läuft schief
  • Rollback.

VERSUCHEN

  • Mail senden "Beginnend mit Snapshot-Statistiken" (Anzahl der Startzeilen in einer Variablen A oder Datei erfassen)
  • Transaktion startet
    • Andere Dinge werden erledigt (innerhalb der DB)
      • Etwas läuft schief.
  • Rollback.
  • Mail senden "Ending with Snapshot Stats"

(Erfassen Sie die Anzahl der Endzeilen in einer Variablen B oder Datei.)

und wenn A & B-Variablen übereinstimmen, wissen Sie, dass ein Fehler vorliegt.

Ändern Sie den Workflow und versuchen Sie, das, was Sie bereits haben, zu Ihrem Vorteil, zum Variablenvergleich usw. zu nutzen.


-1

Dies ist ein Problem, das in der Phase "Requirements Engineering" des Projekts nicht berücksichtigt wurde. Es sollte nicht als Problem des Datenbanksystems angesehen werden, da die Datenbank die ordnungsgemäße Leistung erbringt. Die Mail wird gesendet, weil sie (noch) nicht Teil der richtigen Geschäftslogik ist.

Es wird als Business Logic-Fehler oder möglicherweise sogar als Business Logic-Problem bezeichnet .

Geschäftslogik

In Computersoftware ist Geschäftslogik oder Domänenlogik der Teil des Programms, der die realen Geschäftsregeln codiert, die bestimmen, wie Daten erstellt, gespeichert und geändert werden können. Dies steht im Gegensatz zum Rest der Software, die sich möglicherweise mit Details auf niedrigerer Ebene zum Verwalten einer Datenbank oder zum Anzeigen der Benutzeroberfläche, der Systeminfrastruktur oder zum allgemeinen Verbinden verschiedener Teile des Programms befasst.

Referenz: Geschäftslogik (Wikipedia.org)

Fehler / Probleme in der Geschäftslogik

Webanwendungen sind zum Kernmechanismus für Geschäftsprozesse über das Internet geworden. Da immer mehr Unternehmen auf das Internetmodell migrieren, hat dies zu verschiedenen Problemen und Schwachstellen in der Informationssicherheit geführt. SQL Injection, Cross Site Scripting, Remote Code Execution, um nur einige zu nennen. Abgesehen von den herkömmlichen Sicherheitslücken gibt es jedoch viele Formen von Geschäftslogik-Sicherheitslücken, die häufig von Angreifern ausgenutzt werden. Diese Sicherheitsanfälligkeiten werden während der Qualitätssicherung routinemäßig übersehen, da der Prozess testen soll, was ein Code tun soll und nicht, wozu er gemacht werden kann. Das andere Problem mit Geschäftslogikfehlern ist, dass Scanner sie nicht identifizieren können, IDS sie nicht erkennen kann und Webanwendungsfirewalls sie nicht verteidigen können.

Schwachstellen in der Geschäftslogik sind daher Möglichkeiten, den legitimen Verarbeitungsfluss einer Anwendung so zu nutzen, dass sich negative Auswirkungen auf das Unternehmen ergeben. Die Automatisierung von Geschäftsprozessen wie Kundenbestellungen, Bankanfragen, Überweisungen oder Online-Auktionen erfordert beispielsweise, dass Unternehmen Zugriff auf äußerst vertrauliche Informationen haben. Eine unsachgemäße Implementierung kann zu Fehlern in der Geschäftslogik führen.

Referenz: Sicherheitslücken in der Geschäftslogik und einige häufige Szenarien von Fehlern in der Geschäftslogik (Cyber ​​Security Community)

"Geschäftslogik ist das beabsichtigte Verhalten der Anwendung", erklärte Dan Kuykendall, Co-CEO und CTO von NT OBJECTives. "Es ist die Funktionalität, die den Kern dessen bestimmt, was die Anwendung tut, zum Beispiel, welche Benutzer was sehen dürfen, wie viel Benutzer für verschiedene Elemente berechnet werden usw. Geschäftslogik-Angriffe sind Dinge, die Sie tun können, um die Logik und den Cheat auszunutzen Die Anwendung… (sie) sind schwer zu testen, da sie sowohl ein Verständnis der Anwendung als auch der Sicherheit erfordern. In vielen Fällen kennen QA-Teams die Geschäftslogik, sind jedoch keine Sicherheitsexperten und wurden nicht in der Anwendung geschult clevere Angriffstechniken. "

Referenz: Häufige Fehler in der Geschäftslogik, die die Anwendungssicherheit beeinträchtigen (SecurityWeek.com)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.