Hi,
Ich entwickle gerade ein Programm in C# welches häufig auf eine SQL Datenbank zugreift.
Überwiegend erfolgt der Zugriff lesend.
Es kann jedoch vorkommen, dass bestimmte Objekte in der Datenbank aktualisiert werden müssen. Ein Objekt besteht aus mehreren Datensätzen in verschiedenen Tabellen mit 1:n und m:n Beziehungen.
Die Aufgabe ist folgende:
Ein User kann ein Objekt aktualisieren. Gleichzeitige aktualisierungen des selben Objekts durch mehrere User soll unter allen Umständen nicht möglich sein.
Mein Ansatz:
In C# wird eine Transaktion erzeugt. Die Änderung werden vorgenommen. Dieser Vorgang kann durchaus je nach größe bis zu 60 sek. dauern. Mit Commit wird der Vorgang abgeschlossen. Soweit funktioniert das auch.
Es kann aber vorkommen, dass ein User das Objekt lesen will, während es aktualisiert wird. Für den Lesevorgang verwende ich bisher keine Transaktion.
Ich hätte in diesem moment zwei Scenarien erwartet, mit denen ich, egal welche von beiden auftritt, zufrieden wäre.
1. Der Lesevorgang beginnt und gibt das Ergebnis zurück, welches vor Beginn der Transaktion aktuell war.
2. Der Lesevorgang beginnt und wartet, bis die Transaktion mit Commit oder Rollback abgeschlossen wird, und gibt dann das Ergebnis zurück.
Keines von beiden Fällen trifft aber zu.
Der Lesevorgang beginnt und wartet, bis die Transaktion abgeschlossen ist. Allerdings gibt es dann kein Ergebnis sondern eine Fehlermeldung vom SQL Server das der Thread xy einen DeadLock aufweist und der Vorgang abgebrochen werden musste. Man solle doch diesen nochmal wiederholen.
Weiß jemand, wie oder was ich machen muß damit bei dem Select auf gelockte Datensätze keine Fehlermeldung erscheint ? Sowas wie Fall 1 oder noch lieber Fall 2 wäre mir ganz recht.
Gruss Magic
Ich entwickle gerade ein Programm in C# welches häufig auf eine SQL Datenbank zugreift.
Überwiegend erfolgt der Zugriff lesend.
Es kann jedoch vorkommen, dass bestimmte Objekte in der Datenbank aktualisiert werden müssen. Ein Objekt besteht aus mehreren Datensätzen in verschiedenen Tabellen mit 1:n und m:n Beziehungen.
Die Aufgabe ist folgende:
Ein User kann ein Objekt aktualisieren. Gleichzeitige aktualisierungen des selben Objekts durch mehrere User soll unter allen Umständen nicht möglich sein.
Mein Ansatz:
In C# wird eine Transaktion erzeugt. Die Änderung werden vorgenommen. Dieser Vorgang kann durchaus je nach größe bis zu 60 sek. dauern. Mit Commit wird der Vorgang abgeschlossen. Soweit funktioniert das auch.
Es kann aber vorkommen, dass ein User das Objekt lesen will, während es aktualisiert wird. Für den Lesevorgang verwende ich bisher keine Transaktion.
Ich hätte in diesem moment zwei Scenarien erwartet, mit denen ich, egal welche von beiden auftritt, zufrieden wäre.
1. Der Lesevorgang beginnt und gibt das Ergebnis zurück, welches vor Beginn der Transaktion aktuell war.
2. Der Lesevorgang beginnt und wartet, bis die Transaktion mit Commit oder Rollback abgeschlossen wird, und gibt dann das Ergebnis zurück.
Keines von beiden Fällen trifft aber zu.
Der Lesevorgang beginnt und wartet, bis die Transaktion abgeschlossen ist. Allerdings gibt es dann kein Ergebnis sondern eine Fehlermeldung vom SQL Server das der Thread xy einen DeadLock aufweist und der Vorgang abgebrochen werden musste. Man solle doch diesen nochmal wiederholen.
Weiß jemand, wie oder was ich machen muß damit bei dem Select auf gelockte Datensätze keine Fehlermeldung erscheint ? Sowas wie Fall 1 oder noch lieber Fall 2 wäre mir ganz recht.
Gruss Magic