是否可以进行“脏更新”?

时间:2010-10-18 17:03:33

标签: sql-server-2008 concurrency

我有一个每小时运行一次的SPROC。此SPROC计算用户图稿的流行度并更新主图稿表上的流行度列。这是用户每次上传新作品时都写入的表格。

问题是,这个sproc一直在与另一个事务陷入僵局。

考虑到我并不对每件艺术品的实际得分感到困惑(它只需要大致呈现网站上内容的质量),并且不需要100%准确,因为这个分数不公开。

因此,我希望能够对此专栏进行“脏更新”。

这可能吗?

3 个答案:

答案 0 :(得分:2)

我不相信有任何脏更新。最好调查并解决死锁情况。

答案 1 :(得分:0)

在更新周围放置一个TRY...CATCH块。

答案 2 :(得分:0)

假设您发出一个更新语句来对整个表进行计算,SQL Server引擎在执行事务时会在整个表上获得UPDLOCK。该交易可能需要很长时间,这就是您在线系统看到锁定争用的原因。

您可以通过在SPROC中将SET DEADLOCK_PRIORITY设置为LOW或HIGH来确保哪些交易消失(在线交易或您的艺术分数SPROC)。然后让失败者检查错误1205并重试它是否已回滚。

另一个(更好的)选择可能是让您的艺术作品评分系统以块的形式进行更新。首先是A,然后是B,等等。这样交易会更快。 (您可能需要将数据拆分为更精细的颗粒。相当一般地编写并测试它)