AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen .NET-Sprachen C# Firebird - Mehrere abhängige SQLs in einer Transaktion
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird - Mehrere abhängige SQLs in einer Transaktion

Ein Thema von Neutral General · begonnen am 25. Jan 2016 · letzter Beitrag vom 26. Jan 2016
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#21

AW: Firebird - Mehrere abhängige SQLs in einer Transaktion

  Alt 26. Jan 2016, 09:30
Eben gesehen:
Zitat:
for (int i=0; i < SqlStatements.Count; i++) // List<string> SqlStatements
{
FbCommand cmd = new FbCommand(SqlStatements[i], connection, trans);
cmd.ExecuteNonQuery();
}
...die SQL Statements als Querys hintereinander und nicht als Script. Das sind 2 Paar Schuhe. In deinen DB Komponenten gibt es bestimmt eine Script Komponente. Der übergibst du das Script...fertsch.

Zitat:
In IBExpert läuft sowas natürlich. Selbst ohne das commit work; zwischendurch, aber nur weil IBExpert (scheinbar) implizit an diesen Stellen committed.
Erstell mal in deinem eigenen Code eine Transaktion und versuch diese beiden Befehle hintereinander in dieser Transaktion auszuführen ohne zwischendurch zu committen:
Falsch... Ich führe dieses Script auch in der Anwendung aus. Mit der Scriptkomponente und nicht als Querys.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#22

AW: Firebird - Mehrere abhängige SQLs in einer Transaktion

  Alt 26. Jan 2016, 09:34
Ohne 100%ig sicher zu sein: Aber was glaubst du was die Skriptkomponente sonst macht?

Dann versuch mal in der Skriptkomponente eine Tabelle zu erstellen, Daten einzufügen und danach provozier einen SQL fehler im 3. Befehl und dann machst du ein Rollback.
Ziemlich sicher dass die Tabelle trotzdem da sein wird
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#23

AW: Firebird - Mehrere abhängige SQLs in einer Transaktion

  Alt 26. Jan 2016, 09:53
Zitat:
Dann versuch mal in der Skriptkomponente eine Tabelle zu erstellen, Daten einzufügen und danach provozier einen SQL fehler im 3. Befehl und dann machst du ein Rollback.
Ziemlich sicher dass die Tabelle trotzdem da sein wir
Auch wenn eine Transaktion drumherum ist? ...muß ich echt nochmal bei Gelegenheit prüfen. Ich klinke mich dann mal aus bis ich es definitiv weiß.

Geändert von haentschman (26. Jan 2016 um 09:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#24

AW: Firebird - Mehrere abhängige SQLs in einer Transaktion

  Alt 26. Jan 2016, 10:00
Zitat:
Dann versuch mal in der Skriptkomponente eine Tabelle zu erstellen, Daten einzufügen und danach provozier einen SQL fehler im 3. Befehl und dann machst du ein Rollback.
Ziemlich sicher dass die Tabelle trotzdem da sein wir
Auch wenn eine Transaktion drumherum ist?
Ja. Probiers bitte wirklich mal
Falls es DOCH klappt dann bin ich allerdings verwirrt und irgendwas stimmt hinten und vorne nicht.
Aber nach allem was ich seit gestern gelesen/gelernt habe dürfte das selbst mit Transaktion außenrum nicht funktionieren.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#25

AW: Firebird - Mehrere abhängige SQLs in einer Transaktion

  Alt 26. Jan 2016, 10:05
Zitat:
Aber nach allem was ich seit gestern gelesen/gelernt habe dürfte das selbst mit Transaktion außenrum nicht funktionieren.
...ich lerne auch gern dazu. Bin grad am probieren. Es läßt mir keine Ruhe. Das würde auch mein Konzept auf den Kopf stellen...

I am not amused... Tatsächlich bleiben die Tabellen trotz Rollback zurück. Suuupiii! Ich muß auch das Konzept ändern.

Workaround:
Da es ja um die komplette Erzeugung der Datenbank geht, empfehle ich das Script in einem TRY / EXCEPT Block laufen zu lassen und im Fehlerfalle die erzeugte Datenbank, nach einem DISCONNECT zu löschen.

Geändert von haentschman (26. Jan 2016 um 10:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#26

AW: Firebird - Mehrere abhängige SQLs in einer Transaktion

  Alt 26. Jan 2016, 11:50
I am not amused... Tatsächlich bleiben die Tabellen trotz Rollback zurück. Suuupiii! Ich muß auch das Konzept ändern.

Workaround:
Da es ja um die komplette Erzeugung der Datenbank geht, empfehle ich das Script in einem TRY / EXCEPT Block laufen zu lassen und im Fehlerfalle die erzeugte Datenbank, nach einem DISCONNECT zu löschen.
Willkommen im Club
Leider geht es bei mir NICHT um die komplette Erzeugung einer Datenbank sondern um das erweitern/updaten einer schon vorhandenen aktiven Kundendatenbank mit Daten.
Von daher funktioniert dein Workaround bei mir leider nicht
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.379 Beiträge
 
Delphi 10.3 Rio
 
#27

AW: Firebird - Mehrere abhängige SQLs in einer Transaktion

  Alt 26. Jan 2016, 12:16
Leider geht es bei mir NICHT um die komplette Erzeugung einer Datenbank sondern um das erweitern/updaten einer schon vorhandenen aktiven Kundendatenbank mit Daten.
ähm...

nur mal so von Leidensgenosse zu Leidensgenosse:
Hat dein Arbeitgeber eine so gute Haftpflichtversicherung? Selbst ein triviales CREATE SEQUENCE ohne vorhergehende Datensicherung auf Kundendatenbanken los zu lassen ist... mir fehlen gerade die Worte...

Wenn ich beim Kunden am Rechner bin und selbst dann wenn mir der Kunde versichert, dass er gerade eben eine Datensicherung gemacht hat, der kann mir auch gerne die Datei zeigen, bevor ich auch nur ein Select * from rdb$Database absetze wird eine Datensicherung gemacht. Immer. Grundsätzlich. Und ganz speziell Freitag Nachmittag wenn ich eigentlich den Rechner runter fahren wollte und dann ruft der Kunde noch an

Schon allein aus dem Grund um dem Kunden anschließend beweisen zu können, dass er den Fehler gebaut hat und nicht mein Select * from X an seinem Datenverlust schuld ist.


Und nein: Nicht alle Kunden sind so. Aber einer reicht.

Daher ist die einzig richtige Vorgehensweise:
1. Datensicherung durchführen
2. Datensicherung PRÜFEN! (d.h. in einem temp-Verzeichnis die Datenbank wieder herstellen - weil Firebird div. Fehler erst dann fest stellen kann, wenn er die Datenbank neu schreibt) Wenn Du die Datensicherung nicht restoren kannst, dann hast du keine Datensicherung!
3. Dann (und erst dann) Script einspielen (sicher dass Du den Punkt 2 der Liste nicht übersehen hast?)
Bei unseren Datenbanken (um die 400 MB) braucht das rund ne Minute, bei über 1 GByte je nach Server noch mal deutlich länger. Das ist nicht schön. Aber hast Du schon mal dran gedacht, wie lange es dauert die Daten noch mal einzugeben?

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#28

AW: Firebird - Mehrere abhängige SQLs in einer Transaktion

  Alt 26. Jan 2016, 13:05
Es werden regelmäßig automatische Backups der Kundendatenbank gemacht.
Das Problem ist nur, dass die Datenbank nach eine Skriptfehler in einem (mehr oder weniger) undefinierten Zustand ist,
den man im besten Fall durch das zurückspielen einer Datensicherung oder das manuelle korrigieren der Datenbank bzw. das manuelle Ausführen des restlichen Skripts beheben kann.

Jetzt bleibt wohl nichts anderes übrig als eine Datensicherung zurückzuspielen wenn was schief läuft aber falls es so funktioniert hätte wie ich dachte und man bedingungslos komplette Skripte zurückrollen könnte dann wäre ein Fehler in einem Skript deutlich harmloser und man müsste bloß den Fehler beheben und das Skript erneut ausführen. So war jedenfalls meine Vorstellung.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#29

AW: Firebird - Mehrere abhängige SQLs in einer Transaktion

  Alt 26. Jan 2016, 14:02
Wenn es so ist-Einzelfall-, dann brauchst Du ein Strukturbild (DDL Script) der Kundendb.
Daraufhin musst du gezielt ein (Reparatur)Skript anlegen. Also Reparatur der Struktur.
Alles was dann kommt, die Inhalte, da kannst Du nach Lust und Laune mit Transaktionen / Rollbacks arbeiten. Darauf ist das Konzept ja ausgelegt.

Falls Du ein universelles Update Programm erstellst, wirst Du sicher eine Menge Abnehmer dafür finden.
Gruß, Jo
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#30

AW: Firebird - Mehrere abhängige SQLs in einer Transaktion

  Alt 26. Jan 2016, 15:04
Pseudocode:
Code:
try
{
  foreach (IRevertableScript script in scripts)
  {
    ExecuteScript(script.SetupScript);
    revertable.Add(script);
  }
catch
{
  foreach (IRevertableScript scriptToUndo in revertable)
  {
     ExecuteScript(script.TeardownScript);
  }
}
Anstatt also einfach strings auszuführen, erstellst Du also pro 'Script' ein Objekt, bestehend aus zwei Skripten: Ein 'SetupScript' und ein 'TeardownScript', wobei das TeardownScript quasi die Umkehrfunktion des 'SetupScript' ist.
Also: Create Table => Drop Table etc.

Vermutlich muss man die Teardowns in umgekehrter Reihenfolge ausführen. Für einfache Sachen geht das und viele DB-Migratoren machen das auch so (z.B. der von EF)

Das Konzept an sich ist ja sprachenunabhängig.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz