飘遥的Blog

C/C++/.NET
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

遭遇SqlDataReader锁定表

Posted on 2009-03-29 21:29  Zzx飘遥  阅读(869)  评论(0编辑  收藏  举报
一个数据表,按一定的筛选条件进行检索,检索结果用SqlDataReader逐条读取数据,对检索到的结果进行处理后更新数据库,使其不再符合上述的筛选条件。
当数据表的数据量比较小时,运行正常;当符合条件的数据量较大时(1W多/这个数据与表的结构、表内总数据量、机器性能的有关),更新会报超时错误。
原因是检索时会对表进行锁定,其他连接读取数据时没问题,但更新由于锁的原因会失败,发现DataReader对表进行了锁定。

解决方法:
1.数据量小的时候,将数据加载到DataTable活填充到实体类列表,然后遍历处理更新。这个方法在数据量太大时会造成性能瓶颈。

2.如果数据量大,每次读取一定的数量,然后采用方法1进行处理。缺点是:当有些符合检索条件的数据不符合处理的条件时,不符合条件的数据会累积,累计数量超过每次读取的数量(这里有个排序问题)时,会block住,无法处理新的数据。

3.在检索时显式指定不对表进行锁定,语句为:
select col1, col2, ...
from table1 with(nolock)
where ...
这种方法会造成潜在的数据不一致。

4.还有一种是按分页的思路,用方法1每次处理一页,进行适当的调整后可以解决这个问题。