一个数据表,按一定的筛选条件进行检索,检索结果用SqlDataReader逐条读取数据,对检索到的结果进行处理后更新数据库,使其不再符合上述的筛选条件。
当数据表的数据量比较小时,运行正常;当符合条件的数据量较大时(1W多/这个数据与表的结构、表内总数据量、机器性能的有关),更新会报超时错误。
原因是检索时会对表进行锁定,其他连接读取数据时没问题,但更新由于锁的原因会失败,发现DataReader对表进行了锁定。
解决方法:
1.数据量小的时候,将数据加载到DataTable活填充到实体类列表,然后遍历处理更新。这个方法在数据量太大时会造成性能瓶颈。
2.如果数据量大,每次读取一定的数量,然后采用方法1进行处理。缺点是:当有些符合检索条件的数据不符合处理的条件时,不符合条件的数据会累积,累计数量超过每次读取的数量(这里有个排序问题)时,会block住,无法处理新的数据。
3.在检索时显式指定不对表进行锁定,语句为:
select
col1, col2, ...
from table1 with (nolock)
where ...
from table1 with (nolock)
where ...
这种方法会造成潜在的数据不一致。
4.还有一种是按分页的思路,用方法1每次处理一页,进行适当的调整后可以解决这个问题。