数据表并发锁定
Posted
技术标签:
【中文标题】数据表并发锁定【英文标题】:DataTable Concurrency Locking 【发布时间】:2010-10-05 19:29:54 【问题描述】:我正在帮助修饰一个应用程序,它充满了并发问题。我正在尝试解决它们,并遇到了使用 DataTables 的部分。
数据表本身是静态的,在多个线程之间共享。
我知道使用 dt.Select("...") 本身需要一个 lock 语句,否则在向数据表添加/删除行时会出现问题。但是,当该调用返回时,您将拥有一个 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】:既然您声明您将更新现有行,那么您别无选择,只能锁定对从Select
提取的行的访问。如果有可能它们可以被另一个线程修改,您不能(或至少不应该)访问这些行,即使只是读取。此外,访问单个行可能会触及底层DataTable
的内部结构(我自己也看到过传闻证据),因此即使您只是添加新行,可能仍然是问题。
【讨论】:
呃。我想了很多,并感谢有关访问行的一些信息;我也想知道这一点,因为我认为 DataTables 跨行共享 PK 等。Microsoft 的网站说 DataTables 对读取访问是安全的,如果行本身不是,这真的毫无意义。 @jvenema:是的,它们对于多个读者来说绝对是安全的,但是一旦你把一个作家加入其中,它就会改变一切。 是的,我真的不在乎记录是否在这里和那里过时,但是(例如)如果您在工作时调用 .Add() ,则 select 会引发错误......这会导致问题:)以上是关于数据表并发锁定的主要内容,如果未能解决你的问题,请参考以下文章