私はのDataRowを更新していた場合、私は、全体のDataTableまたはちょうどのDataRowをロックするのですか?

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

質問

私は複数のスレッドから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する

のhttp:/ /social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/11b69e1a-ad6c-48d5-8e14-264af5b0692eする

のDataTableについて読んでテーブルをロックし、あなたが安全に行のデータを更新できるようにする能力に関する矛盾する情報があります。第2のリンクによると、あなたは、テーブルをロックし、行を更新することができます。これはMS MVPからであるので、私は、あなたはおそらく、テーブルをロックし、[OK]をすることができていることだと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top