kossy Geschrieben 7. August 2011 Teilen Geschrieben 7. August 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 7. August 2011 Teilen Geschrieben 7. August 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wurmi Geschrieben 7. August 2011 Teilen Geschrieben 7. August 2011 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kossy Geschrieben 7. August 2011 Autor Teilen Geschrieben 7. August 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 8. August 2011 Teilen Geschrieben 8. August 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kossy Geschrieben 8. August 2011 Autor Teilen Geschrieben 8. August 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 8. August 2011 Teilen Geschrieben 8. August 2011 Das war ja genau der Punkt in meinem ersten Beitrag: Die Transaktion soll nicht in der Prozedur, sondern in der Anwendung gestartet und dort auch beendet werden. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kossy Geschrieben 8. August 2011 Autor Teilen Geschrieben 8. August 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 8. August 2011 Teilen Geschrieben 8. August 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kossy Geschrieben 10. August 2011 Autor Teilen Geschrieben 10. August 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goos Geschrieben 10. August 2011 Teilen Geschrieben 10. August 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kossy Geschrieben 10. August 2011 Autor Teilen Geschrieben 10. August 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goos Geschrieben 10. August 2011 Teilen Geschrieben 10. August 2011 Ja, du liegst richtig Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
streffin Geschrieben 16. August 2011 Teilen Geschrieben 16. August 2011 Es gibt auch noch die Möglichkeit von Try & Catch seit 2005 : http://msdn.microsoft.com/de-de/library/ms175976.aspx Gruß Sven Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.