私はのDataRowを更新していた場合、私は、全体のDataTableまたはちょうどのDataRowをロックするのですか?
-
25-09-2019 - |
質問
私は複数のスレッドからDataTable
にアクセスしていたとします。私は特定の行にアクセスしたい場合は、私がその操作をロックする必要がある疑いが(私はこのことについて誤解かもしれないが、少なくとも私は、私は安全だこの方法を知っている):
// this is a strongly-typed table
OrdersRow row = null;
lock (orderTable.Rows.SyncRoot) {
row = orderTable.FindByOrderId(myOrderId);
}
私はの更新のその行にしたい場合は、しかし、その後、私は(むしろテーブルのRows.SyncRoot
オブジェクトをか)、テーブルをロックする必要があるの再びの、または私は単純にロックすることができます行?
解決
実際には、ただのDataTableのDataRowまたは上の一つの場所にlock
を行わないではない、実際にの行うのもの。 (Monitor
ブロックが何であるかである)lock
ロックを使用して覚えておくべき重要な側面は、オブジェクトをロックすると、それまで何もしないということです。それはそれはあなたが(と同じオブジェクトの)ロックを実行するために持っていることを実現するためにあなたを強制するので、専用のロックを使用して、いくつかの提唱者は、リソース自体をロックするのではなく、オブジェクトが理由の一つだ時はいつでもあなたのリソースとしている取引ます。
DataTable
は内部オブジェクトデータのみを取得する場所へとDataRow
へのオフセットを含んで)があるとして、ということでは言っても、それは、全体DataTable
をロックするには良いアイデアです。このため、あなたは個々の行へのアクセスを同期する場合でも、2つのを更新異なるの行を同時に使用すると、非同期的に同じデータストレージメカニズムを更新するようになります。
競合は「ブラックボックス」として内部型を見て、あなたは(この場合には、行のみをロックする障害のある結論にあなたを導くことになる)に必要なもののみロックとを洞察しようとしている間ここにありますを変えることができる内部型の仕組みと実装の詳細に依存する。
の結末は今、あなたは非同期的の内部データ・ストレージ・システムの更新を避けるために、全体DataTable
をロックする必要があり、それである。
他のヒント
あなたは、ロックする必要はありません。あなたは、データの一貫性...あなたが更新していることを、通常は1行のみを確実にすることができ、最小の量をロックします。あなたは、テーブル間の親/子関係を更新する場合は、各テーブル内の各行をロックする必要があります。
データテーブルは、マルチスレッド読み取り操作のためにのみ安全である
http://msdn.microsoft.com/en -us /ライブラリ/ system.data.datatable.aspxする
のDataTableについて読んでテーブルをロックし、あなたが安全に行のデータを更新できるようにする能力に関する矛盾する情報があります。第2のリンクによると、あなたは、テーブルをロックし、行を更新することができます。これはMS MVPからであるので、私は、あなたはおそらく、テーブルをロックし、[OK]をすることができていることだと思います。