Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Parallelitätsverletzung nach Delete
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

Parallelitätsverletzung nach Delete

beantworten | zitieren | melden

verwendetes Datenbanksystem: MySQL

Hallo,

ich bekomme des öfteren eine Parallelitätsverletzung wenn ich eine Zeile per Delete lösche und dann per TableAdapterManager ein Update durchführe.

Zu dem Thema habe ich viele Threads gefunden, allerdings beziehen sich diese meist darauf, dass die Primärschlüssel nicht aktualisiert sind im Dataset oder dergleichen.
Der Primärschlüssel wird von mir selbst als GUID vergeben.
Wenn ich eine Zeile erstelle, diese meinem Dataset hinzufüge und dann durch den TableAdapterManager in die Datenbank schrieben lasse ist alles ok. Danach rufe ich Dataset.AcceptChanges auf. Wenn ich dann allerdings die Zeile per Delete() lösche und dann wieder das Update aufrufe bekomme ich die Parallelitätsverletzung.
Wenn ich zwischen dem Einfügen und Löschen das Programm neu starte und das Dataset neu fülle klappt es. Also es sieht genau wie das Problem mit den Primärschlüsseln aus aber die erstelle ich ja selbst und ändere sie auch nicht.
Die betroffene Zeile hat beinhaltet Fremdschlüssel, allerdings bleiben die referenzierten Zeilen alle erhalten und sind auch schon in der Datenbank.

Ich hoffe jemand weiß da einen Rat was ich überprüfen kann.


Gruß
-Hades-
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.977

beantworten | zitieren | melden

Es wird nicht durch Schlüssel hervorgerufen, sondern die ParallelitätsExeption kommt immer, wenn die (vermeintlich) gelesenen Daten nicht mit denen in der DB übereinstimmen.

Aber die wird ja durch das Sql erzeugt die der ( unsägliche ) TableAdapter erzeugt.
Da kannst du auch genau sehen was da schief läuft.
private Nachricht | Beiträge des Benutzers
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

beantworten | zitieren | melden

Hey FZelle,

warum unsäglich? Sollte ich anstatt des TableAdapterManager etwas anderes benutzen?
Wie kann ich denn da sehen was da schief läuft?
private Nachricht | Beiträge des Benutzers
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

beantworten | zitieren | melden

Also außer einem Primary Key mit AutoIncrement kann doch eigentlich nichts die Daten der Zeile ändern oder? Ich schreibe ja alle Daten selbst in die Zeile und da gibts auch keinen anderen Benutzer der auf die Datenbank zugreift.

Es sei denn, dass MySQL die Daten der Zeile eigenständig beim Einfügen verändert, das wäre dann natürlich das dümmste was passieren kann, dann würde ich um ein erneutes Fill ja gar nicht herum kommen, das kanns ja nicht sein.
private Nachricht | Beiträge des Benutzers
witte
myCSharp.de - Member



Dabei seit:
Beiträge: 955

beantworten | zitieren | melden

Hallo,

ich erinnere mich dunkel dass früher Mysql automatisch Datums- oder Zeitstempelspalten automatisch gesetzt hat wenn diese leer waren. Prüf das mal ob das bei Dir vorkommt. Der Treiber könnte dann wirklich glauben dass jemand anders die Daten zwischenzeitlich manipuliert hat und verweigert das Update (Optimistisches Sperrkonzept). Du kannst mal per Wireshark schauen welches SQL gesendet wird und was die Antwort vom DBServer ist.
private Nachricht | Beiträge des Benutzers
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

beantworten | zitieren | melden

Also ich habe eine Spalte mit Zeitstempeln, allerdings gibt es keine Zeile mit leerem Zeitstempel...
Kann es vielleicht an der Formatierung des DateTime liegen?
Andere Spalten sind Booleans und z.B. ein Byte-Array als Blob, welches auch nicht leer ist.
Einzig einige Boolean-Spalten werden nicht von mir gesetzt und sind demnach dann DBNull.
private Nachricht | Beiträge des Benutzers
f_igy
myCSharp.de - Member



Dabei seit:
Beiträge: 115

beantworten | zitieren | melden

Hi,

hast Du in der Tabelle irgendwo einen Default Wert definiert? Diese werden dann anstelle von NULL verwendet. Wenn nein würde ich mal nach Besonderheiten bei der BLOB-Verabeitung suchen. So kann Oracle z.B. zwei BLOBs nicht ohne weiteres Vergleichen.

Gruß
f_igy
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Kannst Du nicht einfach den Where des DeleteCommand auf den PK reduzieren ? Dann entfällt der Wertvergleich.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

beantworten | zitieren | melden

Hallo Programmierhans,

danke für die Idee. Kann ich den TableAdapter denn erweitern? Denn der eigentliche Code wird ja generiert, da ich ein typisiertes Dataset benutze. Diesen möchte ich nicht abändern, da sich im Laufe der Zeit immer mal wieder was an der Datenbank ändert.

Ich nehme die Blobs mal raus und teste es dann erneut.
Default-Werte habe ich nicht gesetzt.
private Nachricht | Beiträge des Benutzers
Profox
myCSharp.de - Member



Dabei seit:
Beiträge: 48
Herkunft: Schwarme bei Bremen

beantworten | zitieren | melden

Poste doch mal Deinen Code.
Im übrigen halte ich es mit Fzelle: Schreib die SQL-Kommandos selbst, dann weißt Du genau was passiert.
--
mfG.
Marcel Eckhoff
private Nachricht | Beiträge des Benutzers