SqlServer2008快照隔离模式的业务应用

时间:2023-06-09 18:05:56

场景:

有200个检测点,每个检测点每天采集5个数据,对表的读写都是随机的(即有可能同时读写),总共有5年的数据。

存储方案A:

日期 点号 类型
20120101 001 A 1.0
20120101 001 B 2.0
20120101 001 C 3.0

存储方案B:

日期 类型 001 0002 003 ...
20120101 A 1.0 1.0 1.0 ...
20120101 B 2.0 2.0 2.0 ...
20120101 C 3.0 4.0 4.0 ...

若采用方案A,所有的点在一个表里,行数就非常多,如果一个点一张表表就太多。扩展数据点时容易一些。

采用方案B,所有点在一个表里,一个点一天5条记录,一天1000条,一年下来也就是30多W条,几年的数据也不到1000W,做好索引查询,查询也不会慢。缺点是扩展数据点需要改表,我们采用预留字段的方式解决。

问题:

1.对某个数据点做跨年计算时,需要更新对应的数据。采用的是按天和类型取出一条删除,更新字段值之后插入,使用了事务处理。

2.同时页面查询该表(需要跟其它表联合),有时会出现“事务与另一个进程被死锁。。。。”异常,后来就在查询时添加了with(nolock)

3.当计算和查询并行时,我有个页面需要把某天的5个类型数据都读出来,因为写时事务加锁了,读的时候使用with(nolock)就没读出来锁定的行,结果是数据不全

解决方案:

开启数据库的快照隔离事务模式,去掉with(nolock)。

参考地址:

http://msdn.microsoft.com/zh-cn/library/vstudio/tcbchxcb.aspx