Можно ли сделать «грязное обновление»? - PullRequest
0 голосов
/ 18 октября 2010

У меня есть SPROC, который работает каждый час. Этот SPROC вычисляет популярность пользовательского графического объекта и обновляет столбец популярности на главной таблице графического объекта. Это та же таблица, где пользователи пишут в нее каждый раз, когда загружают новую иллюстрацию.

Проблема в том, что этот sproc продолжает зависать с другой транзакцией.

Учитывая, что меня не смущает фактическая оценка каждой иллюстрации (она просто должна приблизительно представлять качество контента на сайте), и она не должна быть на 100% точной, так как эта оценка не является публичной

Следовательно, я бы хотел сделать «грязное обновление» для этого столбца.

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 18 октября 2010

Я не верю, что существует такая вещь, как грязное обновление. Было бы лучше изучить и устранить тупиковую ситуацию.

0 голосов
/ 18 октября 2010

Предполагая, что вы выполняете один оператор обновления для выполнения вычислений для всей таблицы, ядро ​​SQL Server получает UPDLOCK для всей таблицы во время выполнения транзакции.Транзакция, вероятно, занимает много времени, и именно поэтому вы видите конфликт блокировки с онлайн-системой.

Вы можете убедиться, какая транзакция умирает (либо онлайн-транзакция, либо ваша оценка SPROC), используя SET DEADLOCK_PRIORITYлибо к низкому или высокому в вашем SPROC.Затем попросите проигравшего проверить ошибку 1205 и повторите попытку, если она была отменена.

Другой (лучший) выбор, вероятно, заключается в том, чтобы ваша система оценки работ выполняла обновления в виде фрагментов.Сначала сделайте A, затем B и т. Д. Таким образом, транзакция будет быстрее.(Возможно, вам придется разбить данные на еще более мелкие зерна. Напишите их достаточно обобщенно и протестируйте)

0 голосов
/ 18 октября 2010

Поместите TRY ... CATCH блок вокруг вашего обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...