日期:2014-05-18  浏览次数:20387 次

Sql死锁错误,怎么排除。与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品
我查了一下,发现是两个语句同时处理,然后就出现错误。与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。 


这两个语句是:
1、update [Table] set clicknum=clicknum+1 where id=123456
2、select * from [Table] where clicknum>5 order by NewDate Desc

其中clicknum是加了索引的,填充因子0.6。

为了解决这个问题,我将语句一改为两句,先获取点击数,再加一,然后再更新,问题消失。

我估计问题是 update [Table] set clicknum=clicknum+1 where id=123456 这个语句的问题
这个语句一开始是查clicknum的数值,是共享锁,
后赋值,就转为独占锁了。这样容易出问题。

不知道是不是这样的。这两个语句应该怎么改才不冲突呢?



------解决方案--------------------
把第2句改为:
select * from [Table] with(nolock) where clicknum>5 order by NewDate Desc
允许脏读。