Wenn ich die Aktualisierung von einer DataRow, Sperre ich den gesamten DataTable oder einfach nur die DataRow?
Glaube, ich bin Zugriff auf eine DataTable
von mehreren threads. Wenn ich für den Zugriff auf eine bestimmte Zeile, ich vermute, dass ich gesperrt werden müssen, dass die operation (ich könnte mich irren über diese, aber zumindest weiß ich, auf diese Weise bin ich sicher):
//this is a strongly-typed table
OrdersRow row = null;
lock (orderTable.Rows.SyncRoot) {
row = orderTable.FindByOrderId(myOrderId);
}
Aber dann, wenn ich will update dieser Zeile, soll ich die Tabelle sperren (oder besser gesagt, der Tisch Rows.SyncRoot
Objekt) wieder, oder kann ich einfach den lock auf die row?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich nur die Durchführung einer
lock
an einem Ort auf der DataTable oder DataRow nicht wirklich tun nichts. Ein wichtiger Aspekt zu erinnern, in der mitMonitor
sperren (das ist, was einlock
block ist) ist, dass das sperren eines Objekts nicht alles tun, um es; das ist ein Grund, dass einige plädieren für die Verwendung dedizierter sperren von Objekten, anstatt das sperren der Ressource selbst, da es Sie zwingt zu erkennen, dass Sie durchführen müssen, das Schloss (und auf das gleiche Objekt), wenn Sie Umgang mit den Ressourcen.Dass gesagt wird, es ist eine bessere Idee, sperren das gesamte
DataTable
, als die Datenspeicherung an sich ist dort (in derDataRow
Objekte nur intern, enthalten einen offset in dieDataTable
wie und wo die Daten abgerufen werden sollen). Weil diese, auch wenn Sie synchronisieren Sie den Zugriff auf einzelne Zeilen, die Aktualisierung von zwei verschiedenen Zeilen gleichzeitig führen Sie zur Aktualisierung die gleichen Daten-storage-Mechanismus in einem nicht-synchronisierten Weise.Es ist ein Konflikt hier zwischen der Anzeige der internen Typen als "black box" und sperren Sie nur, was Sie brauchen, um (in diesem Fall, würde man zu einem falschen Schluss ziehen, nur sperren die Zeile) und zu versuchen, um Einsicht in die interne Funktionsweise des geben und sich auf die Einzelheiten der Implementierung das könnte sich ändern.
Das Ergebnis ist, dass, gerade jetzt, sollten Sie sperren das gesamte
DataTable
zu vermeiden, die Aktualisierung der internen Daten-storage-system in einem nicht-synchronisierten Weise.lock
Mechanismus funktioniert... ich habe erkennen, ver-nicht anythign ein Objekt; ich nehme an, ein besserer Weg ich hätte formuliert meine Frage gewesen wäre, "muss ich synchronisieren, update-Operationen pro Zeile oder pro Tisch?" In jedem Fall, es ist mir klar, an diesem Punkt, dass ich muss das synchronisieren von updates beliebiger - Zeile über die gesamte Tabelle-ob beim sperren der Tabelle oder in einem eigenen "table lock" (in diesem Fall ich denke, dieRows.SyncRoot
- Objekt dient diesem Zweck gut, eigentlich).brauchen Sie nicht zu sperren, die für liest - nur für Schreibvorgänge /updates. Sperre der kleinste Betrag, den Sie können, um die Konsistenz der Daten gewährleisten... in der Regel nur die eine Zeile, die Sie aktualisieren. wenn Sie aktualisieren, Eltern /Kind-Beziehungen zwischen den Tabellen müssen Sie die Sperre, die jede Zeile in jeder Tabelle.
Datatable ist nur sicher für multi-threaded read-Operationen:
http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/11b69e1a-ad6c-48d5-8e14-264af5b0692e
Auf das Lesen über die datatable-es gibt widersprüchliche Informationen über die Fähigkeit, um die Tabelle zu sperren und ermöglichen es Ihnen, sicher zu aktualisieren, Daten in einer Zeile. Laut dem zweiten link kannst du die Tabelle sperren und aktualisieren der Zeile. Diese ist aus einem MS-MVP, ich würde sagen, dass kann man wohl die Tabelle sperren und ok sein.