Announcement

Collapse
No announcement yet.

Isolationslevel von Delphi/Ado MSSQL2000

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

  • Isolationslevel von Delphi/Ado MSSQL2000

    Hallo zusammen,

    habe folgendes Problem. Eine Delphi-Routine führt auf der Datenbank (MSSQl2000) ein paar Updates, Deletes usw. durch, welche in einer Transaktion ablaufen. Das Programm soll Netzwerkfähg sein, und die Routine kann von mehreren Clients aus gestartet werden. Es kommt aber immer zu Überschneidungen mit andern Clients, da natürlich in den selben Tabellen gearbeitet wird. Ich möchte nun diese Transaktion als ilSerializable ablaufen lassen. Hatte schon mal ein ähnliches Problem, da konnte ich es damit lösen, allerdings nicht mit Delphi. Ich habe alle Updates,Deletes und inserts in eine Stored Procedure gegeben, dort drinnen SET TRANSACTION ISOLATION LEVEL SERIALIZABLE gesetzt, und am schuss wieder zuwückgesetzt. Damit war dort das Problem erledigt. Hier ist es mir aber schwer möglich alles in eine Stored Procedure zu stecken, weil die berechnung doch etwas komplexer ist, und ich Daten brauche, welche ich nicht so direkt zur Hand habe. Ich habe nun versucht mit Delphi über AdoConnection.IsolationLevel:= ilSerializable und anschliessendes wieder zurücksetzem die Serialisierbarkeit einzustellen. Ohne Erfolg. Nun möchte ich nur wissen - kann man das überhaupt über Delphi handeln, oder soll ich es (wenn überhaupt möglich) schauen in eine Stored Procedure zu verlegen.

    Bin dankbar für jede Hilfe

    Astner Klaus

  • #2
    Hallo Klaus,

    ich kann zwar nichts zu ADO sagen aber ich vermute mal das Du bei einer offenen Datenbankverbindung nicht den Isolationlevel ändern kannst.

    Versuche es mal mit einer 2 Connection mit dem entsprechenden Isolationslevel.

    Gruß

    Torste

    Comment


    • #3
      Hallo Torsten,

      mein Problem ist dann aber folgendes, ich habe ca. 15 Datasets, welche alle in einer Transaktion ihre Daten zurück in die Datenbank schreiben. Nachdem diese Daten geschrieben wurden, beginnt die Berechnung der Daten. Diese muss auch noch innerhalb der Transaktion erfolgen. Wenn ich nun eine 2te Connection verwende, dass weiss ich A) nicht wie mit der Transaktion tun, denn es soll ja alles in einer ablaufen, und B) wenn ich den Datasets vor dem Speichern eine andere Zuweise, dann werde ich wohl die Daten verleiren, oder ?

      mfg

      Astner Klau

      Comment


      • #4
        Hallo,

        immer dann, wenn eine "Leitung" noch von der letzten Aktion belegt ist, spaltet ADO automatisch hinter den Kulissen eine neue Datenbankverbindung ab. Ich würde also zuerst mit dem Profiler des MS SQL Server prüfen, ob das in diesem Fall auch zutrifft. Wenn ja, so laufen diese Aktionen niemals in der gleichen Transaktion ab. In diesem Fall muss man selbst alle Zugriffe so steuern, dass sie nacheinander erfolgen und niemals ein Cursor länger als unbedingt notwendig offen bleibt.

        Erst dann, wenn das eigene Programm die deklarativen Transaktionen von COM+ ausnutzt, spielen die zusätzlichen Datenbankverbindungen keine Rolle mehr. Der DTC (Distributed Transaction Coordinator) sorgt dann dafür, dass alles im gleichen Transaktions-Rahmen ausgeführt wird. Und bei Windows 2000 ist automatisch SERIALIZABLE als einzige Option wirksam.

        Wenn eine Recordset-Objektinstanz den Locktype ltBatchOptimistic nutzt, kann man die Verbindung zur Datenbank trennen, ohne dass die Datenmenge davon beeinträchtigt wird. ADO unterstützt auf Wunsch auch den so genannten Briefcase-Modus (analog zu MIDAS alias dbExpress), bei dem die Datenbankverbindung jeweils am Anfang und Ende nur kurzzeitig aufgebaut wird

        Comment

        Working...
        X