把timestamp列做为主健?请看联机丛书这句话:一个表只能有一个 timestamp 列。每次插入或更新包含 timestamp 列的行时,timestamp 列中的值均会更新。这一属性使 timestamp 列不适合作为键使用,尤其是不能作为主键使用主健意味着什么? 意味着数据行的物理排序,每次更改timestamp, 都导致记录重排,可想IO操作的恐怖程度了。不要说你程序两个进程跑就会死锁,就是单个进程,放在最空闲的时候跑,这种设计也是不允许的,如果我们公司里,你这样做的话,估计上面二话不就让你下岗了。

解决方案 »

  1.   

    关键是库的结构现在不能动了,
    请fcuandy 指点,是TimeStamp做主键导致的死锁吗?
    谢谢
      

  2.   

    timestamp做主健,无论哪个列被更改,引起timestamp列的更新,即主健被更新(默认聚集索引位于主健列),则引起记录行物理重排。
    多个进程访问操作数据时,都有写操作的话,就会产生资源的竞争,而你的操作又不停的在调整记录物理顺序,这应该是导致死锁最主要的原因。
      

  3.   

    关键是库的结构现在不能动了, 
    请fcuandy 指点,是TimeStamp做主键导致的死锁吗? 
    谢谢
      

  4.   

    这是Avgdata表结构
    列名          类型        允许空
    TimeStamp  DateTime     n
    TagName    varchar(30)  n
    OperatorTurn smallint   n
    Value        float      y
    Quality      smallint   y触发器死锁是因为执行时间过长吗?
    谢谢!
      

  5.   

    是datetime类型,不是timeStamp类型?
    然后每次记录有了变动,都是自己代码中去更改timeStamp列的?如果是这样,那么一样。其实你要是否因为这个列引起的问题可以试下:先去掉timestamp的主健属性,或者sp_help avgdata查下聚集索引名,然后删除聚集索引。然后再运行你的程序,看是否频繁死锁。
      

  6.   

    是Datatime类型的,主要的操作是insert或者update新记录。__________________________
    先去掉timestamp的主健属性,或者sp_help avgdata查下聚集索引名,然后删除聚集索引。 然后再运行你的程序,看是否频繁死锁。
    __________________________
    好的,我试一试,非常感谢!