Announcement

Collapse
No announcement yet.

IBX - Transaktion schliesst Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • IBX - Transaktion schliesst Tabellen

    Andreas Kosch - Nach IBTransaction.commit werden alle Tabellen geschlossen.
    Wie kann man dieses schliessen umgehen und trozdem eine eigene Tranaktions-Kontrolle leiten.
    Wo erhalte ich nähere Informationen zu den IBX Kontrolls von Delphi 5.

  • #2
    Hallo,

    die IBX-Komponenten liegen in zwei Ausführungen vor. Zum einen stellt Borland die sogenannten Kompatibilitätsobjekte TIBTable, TIBQuery und TIBUpdateSQL zur Verfügung, um den Umbau von bestehenden BDE-Anwendungen zu erleichtern. Und zum anderen gibt es mit TIBDataSet und TIBSQL "reinrassige" IBX-Komponenten, die für das Entwickeln von neuen Anwendungen verwendet werden sollten.

    In der IBX-Hilfedatei ist auf der Seite <b>Grundlagen zu InterBase Express</b> eine Zusammenstellung zu finden. Man muss sich allerdings jeden Satz genau durchlesen, um die Unterschiede und die sich daraus ergebenden Folgen zu erkennen.

    Um nun auf das Problem mit den Transaktionen zurückzukommen, wie sieht die verwendete Implementierung aus (Komponenten-Mix; Zusammenschaltung; Konfiguration)? Dabei ist es hilfreich, wenn ein Minimal-Beispiel inkl. DFM-Inhalt zur Verfügung gestellt wird

    Comment


    • #3
      Andreas Kosch - zuerst möchte ich ein Lob über dieses Forum, und deine Antworten aussprechen -
      ! Sehr GUT :-)) ! Auch dein neues Buch Client / Server gefällt mir gut, (habe es verschlungen) !.
      So und jetzt zur Sache :
      Zur IBX Hilfe : Ich finde die IBX Hilfedatei gibt über diese neuen Möglichkeiten der Interbase Programmierung
      etwas wenig Infos und Beispiele her. Gibt es irgendwo Erweiterte Infos und Beispiele.

      Zu Transaktion: Ein Unrealistisches Beispiel zu meiner Frage um das ganze einfach zu gestalten:
      Komponenten : Eine IBTable eine IBTransaktion eine IBDatabase.

      ibtransaction.starttransaction;
      ...
      Tabelle wird verändert
      ...
      ibttransaction.commit;

      Nach commit wird die Table geschlossen. Wie kann ich dies Umgehen.
      Verwendet man mehrere Transactions Komponenten ?.

      Eine weitere Frage : Nach deinem Bericht im Entwickler, zu dem ja bereits Diskussionen geführt wurden,
      (Ich finde etwas Ungerecht, diese Sache sollte man etwas Objektiver betrachten, wenn man in der Software -
      Entwicklung alles Pauschalisieren würde bräuchte man keine neue Software, und die Jungs bei Inprise denken
      ja auch etwas bei der Arbeit) ringe ich gerade mit dem Vergleich Table vs. Query, ich aber bemerkt habe, dass
      die Unterschiedlichsten Ergebnisse dabei herauskommen und ich mich irgendwie nicht richtig entscheiden kann
      welche Komponente eingesetzt wird. (War bis Delphi 4 keine Frage die Query). Gibt es einen Tipp aus deinem
      Erfahrungsschatz mit Delphi 5 und IBX da ich noch sehr wenig Erfahrung mit IBX habe.

      Mit bestem Dank im Voraus Tschau

      Comment


      • #4
        Hallo Michael,

        ich fange mit dem zweiten Teil Deiner Frage (TTable vs. TQuery) an. Das ist eine Frage, die niemals pauschal beantwortet werden kann. Je nach den eigenen Projektanforderungen steht entweder die Performance oder die Projektlaufzeit im Vordergrund. In sehr vielen Fällen wird die Performance nicht allein entscheidend sein - als Beweis für die Behauptung soll der Siegeszug der visuellen RAD-Entwicklungsumgebungen (Rapid Application Development) genannt werden. Es wird die vollständige Anwendung heute nicht mehr in Assembler programmiert, sondern in einer visuellen Entwicklungsumgebung (auch wenn damit Performance-Einbußen verbunden sind).

        Die gleiche Situation gilt im C/S-Datenbankbereich. Man hat die Wahl, entweder Server-nah alle SQLs von Hand zu schreiben, oder man greift auf das Know-How der VCL zurück, die SQL selber generieren kann. Im dem von Dir angesprochenen Beitrag im DER ENTWICKLER habe ich gezeigt, das die VCL inzwischen sehr effektive SQL-Anweisungen generieren kann (aber nicht in jedem Fall muß!). Und mit den entsprechenden Werkzeugen (SQL-Monitor, BDE-Callback etc.) kann jeder nachprüfen, ob eine manuelle Korrektur notwendig ist. Der Aufbau der Komponenten für die BDE wurde dahingehend optimiert, die visuelle Entwicklung sehr gut zu unterstützen (d.h. der Entwickler muss nicht alles selber schreiben).

        Die InterBase Express-Komponenten (IBX) hingegen haben ein völlig anderes primäres Ziel. Hier steht die Performance im Vordergrund, so das man niemals den gleichen Komfort wie bei den BDE-Komponenten erwarten darf. Es gibt zwar Kompatiblitätsobjekte (TIBTable und TIBQuery usw.), die den Umstieg von einer BDE-Anwendung erleichtern sollen, aber diese "Zwitter" unterliegen einigen Beschränkungen, die sich aus den notwendigen Kompromissen ergeben müssen. Daher würde ich diese Komponenten nicht in jedem Fall einsetzen, sondern immer dann auf <b>TIBDataset</b> zurückgreifen, wenn die Performance auch wirklich das Hauptziel des Projekts ist. Erschwerend kommt hinzu, das IBX in einigen Punkten eine völlig andere Philosophie als die BDE verwendet (IBX stammt nicht von Borland, sondern wurde von der InterBase-Division aufpoliert, nachdem man die <b>FIB</b>-Komponenten eingekauft hatte). Last - but not least - dürfen auch die gravierenden Bugs in der jetzigen Fassung nicht verschwiegen werden (Stichwort NUMBER-Fehlinterpretation mit anschliessendem <i>SQL Error Code -804</i>).

        Nun zum Kernproblem der Frage: <b>IBX - Transaktion schliesst Tabellen</b>

        Ich hatte ja vorhin gesagt, das IBX in einigen Punkten eine völlig andere Philosophie als die BDE verwendet. Über <b>TIBTransaction.Commit</b> wird ein sogenannter <i>Hard Commit</i> ausgelöst, der die Ergebnismenge auf dem InterBase-Server verwirft. Ab diesem Zeitpunkt gibt es also <b>keine</b> Datenmenge mehr, die TIBTable anzeigen könnte - also macht TIBTable "dicht". Um das automatische Schliessen von TIBTable zu verhindern, muss man nur dafür sorgen, das die Ergebnismenge auf dem Server offen bleibt. Daher muss anstelle TIBTransaction.Commit im <b>AfterPost</b>-Ereignis die Methode <b>CommitRetaining</b> (also ein <i>Soft Commit</i>) aufgerufen werden.
        <pre>
        procedure TDataModule1.IBTable1AfterPost(DataSet: TDataSet);
        begin
        //IBTable1.Transaction.Commit; // IBTable1 wird geschlossen
        IBTable1.Transaction.CommitRetaining; // IBTable1 bleibt offen
        end;
        </pre>

        Auf die Dauer wird man mit IBX nur dann effektiv arbeiten können, wenn man das Zusammenspiel mit dem Server überblickt. Die BDE-Komponenten haben uns an dieser Stelle verwöhnt, indem der Low-Level-Kram über die VCL versteckt wurde

        Comment

        Working...
        X