Table-Lock

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von TheGreenSpoon.

    Table-Lock

    Hallo liebes vb-Paradise-Forum,

    hab da ein kleines Problem mit dem Updaten meiner Tabelle. In meinem Programm habe ein DataGridView, welches mit einer Tabelle verknüpft ist. Beim CellValidating wird der geänderte wert in die Tabelle geschrieben und beim Validating ( also validating des DataGridviews) wird die Tabelle vom DataAdapter geupdatet. Funktioniert alles ganz wunderbar, nur gebe es nicht ab und zu eine Parallelitätsverletzung. Die kommt, wenn man zu Werte im DataGridView ändert. Ich muss dazu sagen, dass im Hintergrund ein Dienst läuft, die Tabelle verarbeitet und Werte berechnet. Ich denk die Parallelitätsverletzung kommt daher, dass ich gleichzeitig die Werte reinschreib und von Dienst abhol.

    Ich würd gern beim Update der Tabelle die Tabelle sperren, sodass der Dienst nicht drauf zugreifen kann.

    Vielleicht irre ich mich auch und es ist was anderes. Wäre nett wenn mir jemand hilft, denn ich verzweifle langsam^^


    Danke im Vorraus.
    Parallelitätsverletzung kommt, wenn beide denselben Datensatz holen. Wenn dann beide ihn geändert zurückspeichern wollen gibts die Parallelitätsverletzung, weil nicht bestimmt werden kann, ob deine Eingabe gültig sein soll, oder die des Dienstes.

    Du mußt also alle Datensätze die du holst und ändern willst sperren, und ebenso der Dienst. Beim Holen sperren, nicht beim Updaten.

    Tja, ich weiß leider nicht, wie das geht.

    Aber vlt. willst du ja auch immer den Vorrang gegenüber dem Dienst - das ist recht leicht machbar - ohne Sperrung. Der Dienst muß einfach die Concurrency-Exception ignorieren, und fortfahren ohne zu speichern (oder den DS neu laden?).
    Du hingegen kannst die Überprüfung auf Parallelitätskonflikte deaktivieren, sodaß deine Updates rücksichtslos speichern.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Erstmal danke für die Antwort.

    Ich hab es jetzt anders gelöst. Jedes mal wenn die Form geöffnet wird, wird ein Parameter in die Datenbank geschrieben, in dem steht, dass die Form offen ist. In meinem Dienst frag ich nach diesem Parameter ab .Wenn der gesetzt ist überspringt er die Abholung und Berechnung dieser Tabelle. :)
    @raist10 Der Dienst ist unter anderem dafür da um alle Buchungen der Mitarbeiter zu verarbeiten und zu berechnen.
    @ErfinderDesRades Also wenn ich die Form öffne und der Dienst ist schon in die Methode gesprungen läuft er Sie noch bis zum Ende durch , weil sonst
    Fehler in der Berechnung passieren können.


    Ich hab mir auch überlegt, dass ich erst beim Validieren des DataGridViews den Dienst "sperr" . Das was ErfinderDesRades gesagt hat, hat mich auch auf etwas gebracht. Ich warte bis die Berechnung durch ist und speicher dann erst.

    TheGreenSpoon schrieb:

    Der Dienst ist unter anderem dafür da um alle Buchungen der Mitarbeiter zu verarbeiten und zu berechnen.


    Hhmmm ... irgendwie verstehe ich das gerade nicht!?

    Ich meine, wenn eine Buchung in eine DB geschrieben ist dann würden doch eh alle "Berechnungen" die in Views u.ä. gespeichert sofort die aktuellen Werte inkl. der neuen Buchung beinhalten.

    Ich kann mich gerade nicht des Eindruckes erwehren, dass Du besser fahren würdest wenn Du den Dienst gleich komplett weg lässt. Denn für das was Du beschreibst was der Dienst tut ist doch eine DB eh von Haus auf viel besser für geeignet.

    Gruß

    Rainer