数据表并发锁定

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 会引发错误......这会导致问题:)

以上是关于数据表并发锁定的主要内容,如果未能解决你的问题,请参考以下文章

锁定机制和数据并发管理(笔记)

mysql数据库锁定机制

MongoDB面试指南之并发

确保更新发生在 Hibernate/HSQLDB 中的并发锁定?

MySQL锁机制

数据库锁机制