首页 文章

DataTable并发锁定

提问于
浏览
2

我正在帮助修改一个应用程序,它充满了并发问题 . 我正在尝试通过它们,并遇到了一个使用DataTables的部分 .

数据表本身是静态的,在许多线程之间共享 .

我知道使用dt.Select(“...”)本身需要一个锁定语句,否则在向数据表中添加/删除行时会遇到问题 . 但是,当该调用返回时,您有一个DataRow对象数组 .

如果我要更新它们,我显然会锁定这些行,但如果我只是阅读它们,它们是否需要锁定?

基本上,鉴于其他地方我们正在添加新行并可能更新现有行,其中哪些是正确的:

lock (dtLock)
{
    DataRow[] rows = dt.Select("...");
}
foreach(DataRow dr in rows)
{
    // read statements only
}

要么

lock (dtLock)
{
    DataRow[] rows = dt.Select("...");

    foreach(DataRow dr in rows)
    {
        // read statements only
    }
}

1 回答

  • 1

    既然您声明要更新现有行,那么您别无选择,只能锁定对从 Select 中提取的行的访问权限 . 如果有可能被另一个线程修改,你甚至不能(或者至少不应该)访问行,即使只是读取 . 此外,有可能(并且我已经看到了自己的证据)访问单个行可以触及底层 DataTable 的内部结构,因此即使您只是添加新行,仍然可能存在问题 .

相关问题