Zum Inhalt springen

Mit TSQL explizit ein Commit in einer Transaktion setzen?


kossy

Empfohlene Beiträge

Hallo zusammen !

Ich habe mal eine weitere Frage an euch. Ich habe mich mal ein wenig mit TSQL beschäftigt und weiß, dass man dort explizit Transaktionen definieren kann und dass diese expliziten Transaktionen erst abgeschlossen sind, sobald man ein Commit setzt, ansonsten ist diese Transaktion noch offen und nicht beendet.

Ich habe ich eigentlich irgendeine Möglichkeit auf Datenbankebene eine explizite Abfrage für meinen Benutzer zu bauen, die ihn fragt, ob er diese Transaktion wirklich mit einem Commit abschließen will, oder geht so etwas nur über eine Benutzeroberfläche?

Vielleicht ein Beispiel:

Eine in C# programmierte Benutzeroberfläche enthält einen Button. Wird dieser Button gedrückt, wird im Hintergrund eine Funktion aufgerufen, die auf der Datenbank ein INSERT oder DELETE ausführt.

Es passiert nun folgendes:

- Der Benutzer drückt den Button

- Der Benutzer erhält die Sicherheitsabfrage, ob er den Befehl wirklich ausführen will (also quasi eine MessageBox die Ja und Nein Schaltfläche enthält)

- Drückt der Benutzer auf Nein, dann passiert ncihts

- Drückt der Benutzer auf Ja, so wird eine Stored Procedure in TSQL gestartet

- Diese Funktion entählt ein Begin Transaction, dann den INSERT Befehl und dann ein Commit, um die Änderungen durch die Transaktion endgültig festzuschreiben

Nun meine Frage: Gibt es irgendeine Möglichkeit, dieses Commit erst festzusetzen, wenn der Benutzer nochmal eine Sicherheitsabfrage mit Ja bestätigt, wie er das zuvor bereits beim Anstoßen der Prozedur getan hat? Ich kenne mich da noch nicht so gut in TSQL aus. Das wäre nämlich wünschesnwert, wenn der Benutzer doch noch merkt, dass er einen Fehler gemact hat und de Prozedur bereits läuft, er diese doch noch einmal rückgängig machen kann.

Danke für eure Hilfe !

Viele Grüße

Kossy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

Prozeduren selbst sollten nur einen COMMIT beinhalten, wenn sie eigenständig arbeiten können. Z.B. wenn eine komplette Batchverarbeitung in TSQL implementiert ist.

Wird die Prozedur hingegen von einer anderen Anwendung aufgerufen, dann sollte die Transaktion immer vom Aufrufer gestartet werden, denn nur er weiß, wann die Transaktion erfolgreich beendet ist und wann nicht.

Mit diesem Vorgehen hat sich auch Dein Problem automatisch erledigt.

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun meine Frage: Gibt es irgendeine Möglichkeit, dieses Commit erst festzusetzen, wenn der Benutzer nochmal eine Sicherheitsabfrage mit Ja bestätigt, wie er das zuvor bereits beim Anstoßen der Prozedur getan hat?

Es geht technisch, aber es gehört zu den No-Go´s in der Datenbankprogrammierung! Eine nicht abgeschlossene Transaktion hat noch Sperren gesetzt und wenn der User vor dem Ja-Klicken vielleicht zuerst noch seinen Büronachbar fragen will und dann spontan beschliesst, mit diesem zur Diskussion der Frage gemeinsam zum Mittagessen in die Kantine zu gehen, blockiert längere Zeit vielleicht wichtige Teile des Systems, ohne es zu ahnen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke schön für eure Beiträge !

Hm, also ich frage mich jetzt, wie ich das Programmtechnisch am besten umsetzen kann. Was genau gehört nun an Code (in meinem Fall C#) in die Benutzeroberfläche / Frontend und was genau gehört nun serverseitig in der Datenbank bzw. dem Backend implementiert (vor allem in Bezug auf den abzusetzenden SQL Befehl und die explizite Transaktion).

Ich muss daher leider nochmal einmal nachhaken, wie genau kann ich das nun am besten und sinnvollsten umsetzen?

Viele Grüße

Kossy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eigentlich doch ganz einfach: Du machst erst die Sicherheitsabfrage, führst dann die Procedur aus und comittest anschließend in Deiner Anwendung die Transaktion.

Des weiteren solltest Du dich auch mit den verschiedenen Lockingarten beschäftigen. Das hier angesprochene pessimistische Locking als auch das optimistische Locking.

Zu diesem Thema hatte ich auch mal in einem anderen Forum eine längere Diskussion, in der Du mehr zu dem Thema erfahren kannst.

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo !

Eigentlich doch ganz einfach: Du machst erst die Sicherheitsabfrage, führst dann die Procedur aus und comittest anschließend in Deiner Anwendung die Transaktion.

Ok, aber was mich noch nicht ganz klar ist, wie ich die Transaktion innerhalb der Anwendung "Comitten" kann, wenn ich eine serverseitige Stored Procedure mit TSQL ausführe, in der auch die Transaktion gestartet wird. Gibt es dafür vielleicht irgendwo ein Codebeispiel? Was das alles innerhalb einer serverseitigen Prozedur ausgeführt wird, dann ist es ja kein Problem, aber dann kann ich ja keine weitere Sicherheitsabfrage einbauen.

Viele Grüße

Kossy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Dim !

Also da ich in C# und TSQL noch ein Neuling bin und nicht ganz sicher bin, ob ich Dich richtig verstanden habe, hier das ganze Vorhaben nochmal in einer Art Pseudocode:

//Diese Funktion wird im Frontend bzw. in der Benutzeroberfläche der Anwendung ausgeführt

FunktionNachButtonDrücken(){


      Message.Show("Möchten Sie die SQl Anweisung tatsächlich ausführen?");

      //Ja und Nein Schaltflächen werden jetzt angezeigt


      If (Ja wurde gedrückt){


             Begin Transaction;


             //Insert SQL Statement wird jetzt an die Datenbank abgesetzt


             Message.Show("Möchte Sie die Transaktion endgültig festschreiben?");

             //Ja und Nein Schaltflächen werden jetzt angezeigt



             If (Ja wurde gedrückt)


                     Commit Transaction;


             Else


                     Rollback Transaction

                     Message.Show("Die Transaktion wurde wieder zurückgesetzt !");


}

Ist das so halbwegs korrekt und ich kann direkt TSQL Befehle in die Benutzeroberfläche einbetten?

Viele Grüße

Kossy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein eher so:

If (Ja wurde gedrückt){

  Message.Show("Möchte Sie die Transaktion endgültig festschreiben?");

             //Ja und Nein Schaltflächen werden jetzt angezeigt

             If (Ja wurde gedrückt)

             Begin Transaction;

             //Insert SQL Statement wird jetzt an die Datenbank abgesetzt

              Commit Transaction;

             Else

                   //Nix

}

Es gibt keinen Grund, die Transaktion über eine Benutzereingabe hinweg offen zu halten, denn ansonsten kann der Fall eintreten, den Wurmi beschrieben hat.

Die Fehlerbehandlung (z.B. Uniqueconstraint Verletzungen oder Foreign Key Verletzungen) müssen natürlich ggf. noch ergänzt werden.

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Dim !

Ich habe nochmal ne Frage. Unabhängig davon, wie ich nun mein geplantes Vorhaben codetechnisch umsetze, würde es mir trotzdem nochmal interessieren, ob es wirklich gar keine Möglichkeit in TSQL solche Abfragefenster mit Ja / Nein Schaltfläche zu realisieren?

Also ich weiß, dass es in TSQL die Codestrukturen IF / ELSE, SWITCH, WHILE- und FOR-Schleife gibt. Aber habe ich eine Möglichkeit, irgendwie diese Codestrukturen auch für Benutzerinteraktionen zu verwenden (auch wenn das eigentlich Programmierung auf der Datenbankebene ist)?

Oder sind solche Strukturen ausschließlich für die Datenverarbeitung mit Variablen im Hintergrund bzw. auf Datenbankebene zu verwenden?

Danke für die Hilfe !

Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Kossy,

lies mal "Beispiel eines Client-Server-Systems mit zentralem Datenbankserver"

auf Client-Server-Modell und versuch dir dann deine Frage selbst zu beantworten.

Goos

Hallo !

Also ich schlußfolgere daraus, dass mein Vorhaben nicht gelingen wird. Ich würde aber trotzdem gerne nochmal explizit wissen wollen, ob ich damit nun richtig liege oder nicht?

mfg

Kossy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...