日期:2014-05-17  浏览次数:20415 次

求救:sqlserver2005表触发器惹的祸
表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.找个系统可停时间.
 2.把A,B表的数据备份.
 3.删除重建A,B表,设自增列.删除P表.
 4.导回数据到A,B表.
 5.前端程序写法更新.
------解决方案--------------------
但现在A、B表中记录的MaxID是有相同的,所以还是不可行。
--> 不明白. A,B表是2个单独的表,对于这个处理没有影响.

建议尽量往这个方向想办法,实在没办法的话,只能去分析死锁了..
分析死锁比较麻烦,网上很多文章可参考.