Wenn ich eine DataRow bin aktualisieren, muss ich die gesamte Datentabelle sperren oder nur die DataRow?

StackOverflow https://stackoverflow.com/questions/2607661

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top