Wenn ich eine DataRow bin aktualisieren, muss ich die gesamte Datentabelle sperren oder nur die DataRow?
-
25-09-2019 - |
Frage
Angenommen, ich bin ein DataTable
von mehreren Threads zugegriffen wird. Wenn ich eine bestimmte Zeile zugreifen wollen, vermute ich, ich brauche diesen Betrieb zu sperren (ich konnte darüber verwechselt werden, 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 diese Zeile soll ich sperre die Tabelle (oder besser gesagt, die Rows.SyncRoot
Objekt Tabelle) wieder , oder kann ich einfach sperrt die Zeile?
Lösung
Eigentlich nur ein lock
an einem Ort auf der Datatable oder DataRow Durchführung nicht wirklich tun nichts. Ein wichtiger Aspekt bei der Verwendung Monitor
Schlösser zu erinnern (was ein lock
Block ist) besteht darin, dass ein Objekt Sperren nicht alles tun, um es; Das ist ein Grund, dass einige Befürworter spezielle Verriegelung, Objekte, anstatt die Ressource selbst sperren, da es zwingt Dich zu erkennen, dass Sie die Sperre auszuführen (und auf demselben Objekt), wenn man es zu tun mit der Ressource.
Das wird gesagt, es ist eine bessere Idee, die gesamte DataTable
zu sperren, da die Datenspeicherung selbst gibt es (die DataRow
intern nur Objekte enthalten ein Versatz in den DataTable
, wo die Daten abgerufen werden). Aus diesem Grunde, auch wenn Sie den Zugriff auf einzelne Zeilen zu synchronisieren, zu aktualisieren zwei andere Zeilen gleichzeitig führen, dass Sie den gleichen Datenspeichermechanismus in einer nicht-synchronisierten Weise aktualisieren.
Es gibt einen Konflikt hier zwischen der Anzeige interne Typen als „Black Box“ und Sperren nur das, was Sie brauchen, um (was in diesem Fall würden Sie zu einem fehlerhaften Schluss führen, der nur die Zeilen Sperren) und versuchen, Einblick zu gewinnen in die internen Abläufe des Typs und unter Berufung auf Implementierungsdetails das ändern könnten .
Das Ergebnis ist, dass gerade jetzt, sollten Sie das gesamte DataTable
sperren das interne Datenspeichersystem in einer nicht-synchronisierten Weise zu vermeiden aktualisieren .
Andere Tipps
Sie nicht Sperre müssen für liest - nur für schreibt / Updates. sperrt die kleinste Menge, dass Sie können, die Datenkonsistenz zu gewährleisten, ... in der Regel nur die eine Zeile, die Sie aktualisieren. wenn Sie Eltern / Kind-Beziehungen zwischen Tabellen aktualisieren, müssen Sie jede Zeile in jeder Tabelle sperren.
Die Datentabelle ist nur sicher für Multi-Operationen Gewinde lesen:
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
Beim Lesen über die Datentabelle gibt es widersprüchlichen Informationen die Möglichkeit, über die Tabelle zu sperren und ermöglicht es Ihnen sicher Daten aktualisieren in einer Reihe. Gemäß dem zweiten Link können Sie die Tabelle sperren und die Zeile aktualisieren. Da dies von einem MS MVP ist, würde ich sagen, dass Sie wahrscheinlich die Tabelle sperren und in Ordnung sein.