 |
| |
|
|
 |
Autor |
Nachricht |
 |
| |
| alzaimar |
#1| Verfasst am: 05.01.2009, 22:14 Titel: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
Moderator Alter: 46 Status: offline Beiträge: 4.693 angemeldet: 06.05.2005 Wohnort: Berlin RAD-Studio 2007 Enterprise

|
Sprache: Delphi (Win32) Datenbank: Firebird, Version: 2.x, Zugriff über: TIB-Komponenten Hiho,
Ich erzeuge eine TIBDatabase, eine TIBTransaction und ein TIBDataset. Im TIBDataset steht sowas wie 'select * from Daten'.
Ich öffne das TIBDataset, lese alle Zeilen ein, merke mir die IDs, schließe das TIBDataset und dann baue ich mir aus den gemerkten IDs ein Delete-Statement zusammen:
Delphi-Quellcode: | zusammenfalten | markieren | 1 · · · 5 · · · · 10 · · · · 15 · · · · 20 · · · · 25 · · · · 30 · · · · 35 · · · · 40 · · · · 45
| const
szDelete = 'Delete from %s where ID in (%s)';
var
sData: string;
sDeleteList: string;
begin
fQuery.Dataset.Active := True; // fQuery ist ein privates Feld einer 'TFoobarQuery', die widerum das TIBDataset kapselt
sDeleteList := '';
try
fQuery.Dataset.First;
while not fQuery.Dataset.Eof do begin
sDeleteList := sDeleteList + VarToStr (fQuery.Dataset['ID']) + ',';
fQuery.Dataset.Next;
end;
finally
fQuery.Dataset.Active := False;
if sDeleteList <> '' then begin
SetLength(sDeleteList, Length(sDeleteList) - 1);
fConnection.Execute(Format(szDelete, [fTableName, sDeleteList])); // fConnection ist eine TFoobarConnection, die
end; // eine TIBDatabase kapselt.
end;
end;
...
procedure TConnection.Execute(const sSQL: string);
var
cmd: TIBScript;
begin
cmd := TIBScript.Create(nil);
try
fTransaction.StartTransaction;
try
cmd.Database := fDatabase;
cmd.Script.Text := sSQL;
cmd.ExecuteScript;
fTransaction.Commit;
except
fTransaction.Rollback;
raise;
end;
finally
cmd.Free;
end;
end; |
|
Beim 1. Aufruf werden alle Zeilen eingelesen, das Delete-Statement gebastelt und alle Zeilen gelöscht. Toll.
Nun füge ich eine Zeile ein und rufe die o.g. Routine nochmal auf. Was soll ich sagen, das Dataset enthält die selben Daten, wie eben, obwohl die gelöscht sind (per IBExpert nachgeschaut).
Wie muss ich das anstellen, das so etwas Einfaches funktioniert, also das beim 2.Lesen mal zur Abwechslung andere Daten im Dateset stehen?
Danke und Grüße |
 "Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
Zuletzt bearbeitet von alzaimar am 05.01.2009, 22:24, insgesamt 2-mal bearbeitet. |
 |
|
|
|
| |
| ULIK |
#2| Verfasst am: 05.01.2009, 22:25 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
aktives Mitglied Alter: 41 Status: offline Beiträge: 146 angemeldet: 25.09.2006 Wohnort: Regensburg RAD-Studio 2007 Professional

|
Kann das ein Problem mit den Transaktionen sein? Dein Dataset nutzt wohl eine andere Transaktion wie das Lösch-Statement. Wenn die Transaktion der Dataset nicht beendet wurde und der Isolation-Level auf RepeatableRead steht, dann sollten wohl immer die gleichen gleichen Daten gelesen werden. Hilt es hier, auf ReadCommited zu gehen bzw. die auch das Lesen in expliziten Transaktionen zu starten?
(Kann's momentan nicht testen, drum nur Vermutungen)
Grüße,
Uli |
|
 |
|
|
|
| |
| Sir Rufo |
#3| Verfasst am: 06.01.2009, 01:27 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
sehr aktives Mitglied Alter: 42 Status: offline Beiträge: 893 angemeldet: 05.01.2005 Wohnort: Stadthagen Delphi 2010 Professional

|
Es sieht wohl eher so aus, als ob die Daten noch im Cache gehalten werden.
Mit ReQuery müsste man eigentlich eine neue Abfrage erzwingen können. |
 Kaum macht man's richtig - schon funktioniert's |
 |
|
|
|
| |
| alzaimar |
#4| Verfasst am: 06.01.2009, 07:17 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
Moderator Alter: 46 Status: offline Beiträge: 4.693 angemeldet: 06.05.2005 Wohnort: Berlin RAD-Studio 2007 Enterprise

|
ULIK: Dataset und Skript verwenden die gleiche Transaktion. Den Isolation Level kann ich nicht einstellen.
Sir Rufo: Wie führt man mit einem TIBDataset ein 'ReQuery' aus?
Bei IBExpert muss ich selbst SELECT-Anweisungen ('Data'-Tab in der Tabellenansicht) committen, um Änderungen sichtbar zu machen. Kann es sein, das das hier fehlt? Wieso muss man eigentlich SELECT-Anweisungen committen? |
 "Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare") |
 |
|
|
|
| |
| Blup |
#5| Verfasst am: 06.01.2009, 09:24 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
sehr aktives Mitglied Status: offline Beiträge: 409 angemeldet: 07.08.2008

|
| alzaimar hat folgendes geschrieben: | ULIK: Dataset und Skript verwenden die gleiche Transaktion. Den Isolation Level kann ich nicht einstellen.
Sir Rufo: Wie führt man mit einem TIBDataset ein 'ReQuery' aus?
Bei IBExpert muss ich selbst SELECT-Anweisungen ('Data'-Tab in der Tabellenansicht) committen, um Änderungen sichtbar zu machen. Kann es sein, das das hier fehlt? Wieso muss man eigentlich SELECT-Anweisungen committen?  |
Offensichtlich verwendet das Script nicht die selbe Transaktion, wie man deinem Quelltext entnehmen kann.
Der Skriptkomponente wird keine Transaktion zugewiesen, damit erzeugt diese sich temporär eine eigene.
Auch das Lesen der Daten startet eine Datenbanktransaktion. So lange diese nicht abgeschlossen ist, wirst du innerhalb dieser Transaktion immer die Daten erhalten, die zum Zeitpunkt des Transaktionsstarts gültig waren oder innerhalb der Transaktion verändert wurden. Solange nur Daten gelesen werden, ist es egal ob mit Commit oder Rollback beendet wird.
Natürlich alles abhängig von der Art der Isolation...
http://de.wikipedia.org/wiki/Isolation_(Datenbank) |
|
 |
|
|
|
| |
| alzaimar |
#6| Verfasst am: 06.01.2009, 10:40 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
Moderator Alter: 46 Status: offline Beiträge: 4.693 angemeldet: 06.05.2005 Wohnort: Berlin RAD-Studio 2007 Enterprise

|
Hi Blup,
Danke für die Info: Ich kann das jetzt nicht testen (bin auf Arbeit), aber das könnte es wirklich sein (Skript/Transaktion).
Muss ich ein eigentlich ein 'SELECT' explizit mit einem 'StartTransaction/Commit' umschließen? Ich möchte solche Aktionen (SELECT, DELETE usw.) gerne vollständig kapseln und reentrant gestaltent, das also z.B. der Aufruf einer 'Select'-Methode nicht zu einem 'Transaktion ist noch offen' führt, was hier auch passiert ist.
Entschuldigt meine Unkenntnis, aber mit Firebird/TIBxxxx-Komponenten hab ich bisher nicht gearbeitet, sondern immer nur mit ADO, wo Transaktionen explizit angestoßen werden. |
 "Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare") |
 |
|
|
|
| |
| Hansa |
#7| Verfasst am: 06.01.2009, 13:43 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
Mitglied Beiträge: 7.153 angemeldet: 09.06.2002 Wohnort: Saarland Delphi 8 Professional

|
@Alzaimar : in Deinem Alter sollte man sich mal so langsam mit Multi-Generationen-Architektur beschäftigen. Damit man nicht wirklich jedes select umständlich mit StartTransaction-Commit/Rollback umschließen muss, gibts ja die Transaction-Isolation-Levels. Z.B. read_commited |
 Gruß
Hansa |
 |
|
|
|
| |
| mkinzler |
#8| Verfasst am: 06.01.2009, 14:13 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
Moderator Beiträge: 27.700 angemeldet: 09.12.2005 Wohnort: Heilbronn Delphi 2010 Professional

|
Transaktionsisolation hat imho recht wenig mit MGA zu tun. |
|
 |
|
|
|
| |
| alzaimar |
#9| Verfasst am: 06.01.2009, 20:08 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
Moderator Alter: 46 Status: offline Beiträge: 4.693 angemeldet: 06.05.2005 Wohnort: Berlin RAD-Studio 2007 Enterprise

|
Hurra! Ich habe es geschafft! Ein Programm, das funktioniert!
Isolation Level eingestellt, dem Skript die gleiche Transaktion verpasst und
Etwas schade allerdings, das eine so wichtige Eigenschaft wie 'Isolation Level' in der undokumentierten Params-Eigenschaft versteckt ist. Na ja, IB ist eben nur etwas für wahre Männer.
Danke für die sachliche Hilfe und das Verkneifen fieser Kommentare. Mein besonderer Dank gilt dem einzig wahren FB/IB Guru: "Uns" Hansa . |
 "Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare") |
 |
|
|
|
| |
| Sir Rufo |
#10| Verfasst am: 06.01.2009, 20:19 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
sehr aktives Mitglied Alter: 42 Status: offline Beiträge: 893 angemeldet: 05.01.2005 Wohnort: Stadthagen Delphi 2010 Professional

|
| alzaimar hat folgendes geschrieben: | Hurra! Ich habe es geschafft! Ein Programm, das funktioniert!
Isolation Level eingestellt, dem Skript die gleiche Transaktion verpasst und
Etwas schade allerdings, das eine so wichtige Eigenschaft wie 'Isolation Level' in der undokumentierten Params-Eigenschaft versteckt ist. Na ja, IB ist eben nur etwas für wahre Männer. |
Autotest Opel Corsa: hakelige Schaltung, schwere Kupplung => Fazit: scheiß Karre
Autotest Ferrari: hakelige Schaltung, schwere Kupplung => Fazit: geilste Karre von Welt
| alzaimar hat folgendes geschrieben: | Danke für die sachliche Hilfe und das Verkneifen fieser Kommentare. Mein besonderer Dank gilt dem einzig wahren FB/IB Guru: "Uns" Hansa . |
"fiese Kommentare" ... wir ... NIEMALS ... |
 Kaum macht man's richtig - schon funktioniert's |
 |
|
|
|
| |
| mkinzler |
#11| Verfasst am: 06.01.2009, 20:20 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
Moderator Beiträge: 27.700 angemeldet: 09.12.2005 Wohnort: Heilbronn Delphi 2010 Professional

|
Tja IBX ist halt nicht unbedingt das Gelbe vom Ei. Andere Komponenten(sammlungen) lösen das besser |
|
 |
|
|
|
| |
| alzaimar |
#12| Verfasst am: 06.01.2009, 21:57 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
Moderator Alter: 46 Status: offline Beiträge: 4.693 angemeldet: 06.05.2005 Wohnort: Berlin RAD-Studio 2007 Enterprise

|
| mkinzler hat folgendes geschrieben: | | Tja IBX ist halt nicht unbedingt das Gelbe vom Ei. Andere Komponenten(sammlungen) lösen das besser |
Sieht wohl so aus, aber ich brauch die Events und hab kein Bock, Geld auszugeben (noch nicht). |
 "Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare") |
 |
|
|
|
| |
| Hansa |
#13| Verfasst am: 07.01.2009, 01:47 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
Mitglied Beiträge: 7.153 angemeldet: 09.06.2002 Wohnort: Saarland Delphi 8 Professional

|
| mkinzler hat folgendes geschrieben: | | Transaktionsisolation hat imho recht wenig mit MGA zu tun. |
Wie, was ? In FB ist es doch möglich, auf ein und demselben Stand der DB zu bleiben. Selbst wenn noch 100 User mit dem Programm tausende Transaktionen neu erzeugen und der erste 1 Jahr in Urlaub fährt. Na und ? Nach einem Jahr dürfte der Rechner neu aufgebaut sein, weil die OIT voll zuschlägt. "Rechner ist abgestürzt, zuerst wurde er immer langsamer, du warst ja nicht da". Vielleicht verstehe ich nicht genau, was Alzaimar meint, aber ohne solche Querschläger in Kauf zu nehmen ist es wohl besser, die lesenden Zugriffe aus dem OIT-Krempel rauszuhalten. Genau da schlägt nämlich eventuell die MGA zu. Alzaimar kann selbstverständlich statt dieser Transaction-Isolation gerne im Programm öfters mal Commit StartTransaction etc. schreiben. |
 Gruß
Hansa |
 |
|
|
|
| |
| mkinzler |
#14| Verfasst am: 07.01.2009, 06:39 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
Moderator Beiträge: 27.700 angemeldet: 09.12.2005 Wohnort: Heilbronn Delphi 2010 Professional

|
MGA ist die Implementierung von Transakationen in IB/FB. Es gibt aber auch andere Möglichkeiten, welche andere DBMS nutzen. Für den Anwender ist es egal wie dieses Feature implementiert wurde. |
|
 |
|
|
|
| |
| alzaimar |
#15| Verfasst am: 07.01.2009, 07:14 Titel: Re: Firebird, TIBDataset Löschanweisungen unsichtbar |
 |
 |
 |
|
Moderator Alter: 46 Status: offline Beiträge: 4.693 angemeldet: 06.05.2005 Wohnort: Berlin RAD-Studio 2007 Enterprise

|
Moin
Ich habe einen Zweibenutzerbetrieb: Eine Anwendung (A) schreibt Daten in die DB. Dabei werden Events ausgelöst. Die andere Anwendung (B) reagiert auf diese Events, liest die Daten und löscht sie. Das macht sie aber nur dann, wenn sie die Daten per TCP an ein anderes Programm übertragen kann. Wenn da Keiner ist, werden die Events ignoriert, und die DB wächst. Sobald jemand per TCP erreichbar ist, werden die gepufferten Daten übertragen. Das Ganze ist eine Art Messwerte-Puffer, also nix mit MGA, OIT, KBS* oder HWD**.
Ich hab das so vor ein paar Wochen so übernommen (*Aussrede* ). Der Typ, der das verzapft hat, hat IB und dbExpress-Komponenten gemischt, und ich wollte u.A. dbExpress aus der Anwendung rausnehmen. Wenn jemand übrigens eine bessere Idee hat, oder fertige Pattern für solche Puffer vorzuweisen hat, immer her damit. Aber das wäre eine Frage für einen neuen Thread...
*KBS: Keinen Blassen Schimmer
** HWD: Hä Watn Dat? |
 "Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare") |
 |
|
|
|
 |
|
 |
| |
|
|
| |
 
|
|
| |
|
Du darfst keine Beiträge in dieses Forum schreiben. Du darfst auf Beiträge in diesem Forum nicht antworten. Du darfst Deine Beiträge in diesem Forum nicht bearbeiten. Du darfst Deine Beiträge in diesem Forum nicht löschen. Du darfst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum nicht posten. Du kannst Dateien in diesem Forum nicht herunterladen.
|
|
 |