表P专门存放表A和表B的最大MaxID,表A、B都有AfterInerted 触发器,每当向A、B添加一条记录的时候MaxID都从P中读取(select @MaxID=Max(Num) fom P where p.TableName='A'),(select @MaxID=Max(Num) fom P where p.TableName='B')然后把记录添加到A、B表,添加成功后触发器中再将P表中对应的A、B表的MaxID加1,(update P set Num=Num+1 where TableName='A' ),B表触发器一样的,现在的问题是:当数据库出现并发的时候就有问题了,这个触发器老是报错:Trg_AlterMaxNum :事务(进程 ID 65)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
这个问题应该怎么解决呢有什么更好的办法来替代这样一个触发器而又不影响他的逻辑?SQL Server数据库事务并发

解决方案 »

  1.   

    A,B表都用自增列(identity)不就行了?
      

  2.   

    可以实现的:
     1.找个系统可停时间.
     2.把A,B表的数据备份.
     3.删除重建A,B表,设自增列.删除P表.
     4.导回数据到A,B表.
     5.前端程序写法更新.
      

  3.   

    你说的我又考虑过的,但现在A、B表中记录的MaxID是有相同的,所以还是不可行。
    其实A、B表所记录的是不同站点的连续的ID号。
      

  4.   

    但现在A、B表中记录的MaxID是有相同的,所以还是不可行。
    --> 不明白. A,B表是2个单独的表,对于这个处理没有影响.建议尽量往这个方向想办法,实在没办法的话,只能去分析死锁了..
    分析死锁比较麻烦,网上很多文章可参考.
      

  5.   


    哦,我刚刚说的有点模糊是这样的,如:A表的站点C的MaxID从1....n,A表中同样的存在站点D,D的MaxID也是从1....n,所以说刚刚那个方法也考虑过还是不行,还有其他的办法吗,我想用一个存储过程来代替,但是如果都不能及时的更新那个MaxID就会报错,还是一样的效果。
      

  6.   

    把A表对应的数据存放于PA表
    把B表对应的数据存放于PB表。
    PA和PB均设置为自增长。
      

  7.   


    哦,明白你的意思,那要新建两个表然后把数据导入到新表去,然后再把A、B表删掉,然后把PA、PB修改为A、B的名称,这个方法或许可以值得一试。