Announcement

Collapse
No announcement yet.

Transaktionen mit AdoConnection

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

  • Transaktionen mit AdoConnection

    Sobald ein Client eine Transaktion startet und in der Kunden-Tabelle über
    AdoQuery einen Datensatz editiert können die anderen Clients die gesammte Kunden-Datenmenge nicht mehr öffnen. Die Kunden-Querys der anderen Clients laufen auf einen Timeout. Ich benutze den SQL-Server 7 und 2000. Ich habe alle Isolations-Stufen ausprobiert kam aber immer auf das selbe Ergebnis.
    Mein Zweck der Transaktion soll sein, das Datensätze die neueingetragen werden mit allen abhängigen Daten erst Sichtbar Werden, wenn ich Commit aufrufe.
    Wer kann mir helfen ?

  • #2
    Du könntest folgendes machen:

    Wenn ein Benutzer einen Datensatz editiert, wird über eine Sperrtabelle (suche im Forum mal danach) dies eingetragen. Die Speicherung der geänderten Daten werden über eine kurze Transaktion durchgeführt.

    Du hast mit deiner Lösung das Problem, daß Transaktionen je nach verwendeten DB-System nicht nur die geänderten Einträge einer Tabelle sperren, sondern unter Umständen ganze DB-Seitn (mehrere Einträge) oder gleich die ganze Tabelle. Auch belastest Du mit solchen langandauernden Transaktionen den Server unnötig. Deshalb sollten Transaktionen eine möglichst kurze Dauer besitzen und keinesfalls so lange laufen, wie ein Benutzer braucht um einen Datensatz zu löschen

    Comment


    • #3
      Das war auch nur ein Beispiel mit Kunden-Tabelle das Problem ist etwas Komplexer. Es gibt 6 Tabelle die miteinander Verknüpft sind. Der papa ist "Job" und darunter sind Aktionen die ich zuweisen kann, diverse Typen-Tabellen usw. Diese ganzen änderungen kann ich mir nicht merken, daher benutze ich Transaktionen. Der User kann 30 Änderungen und unterschiedlichste einstellungen unter dem Job machen, wenn er dann aber sagt war nur Spass dann Rollback. Wennn man mit vielen Tabellen in Abhängigkeit Arbeitet, wird auch für jede zuweisung ein Eintrag in einer Tabelle gemacht oder auch wieder gelöscht, das kann man nur innerhalb von Transaktionen machen.
      Server-Zeit oder Performance ist kein Problem.
      Sinn einer Transaktion bei ilReadCommitted ist doch das nur abgeschlossene Transaktionen sichtbar sind, nichtabgeschlossene eben nicht. Und bei mir wird tatsächlich die ganze Tabelle gespert

      Comment


      • #4
        Mit den IsolationLevel kommt man beim SQL Server bei solchen Problemen nicht weiter da der SQL Server im Gegensatz zu Qracle oder Interbase kein Form des Multiversionskonsistenzmodells unterstützt. D.h. ein Anwender kann nicht Daten ändern während alle anderen die bisherigen ungeänderten Daten sehen .Im SQL Server müßen diese Daten gesperrt werden oder man könnte noch nicht commitete Daten einer anderen Transaktion sehen (ganz schlecht).

        Um das Locking feiner als über das IsolationLevel einzustellen sollten
        sie sich die with-Clause des SQL Server genauer ansehen.

        z.B mit
        select * from TABLENAME with (UPDLOCK ROWLOCK) where .....

        werden wirklich nur einzelne Rows gesperrt und auch nur dann
        wenn sie geändert wurden

        Comment

        Working...
        X