Можно ли с помощью TSQL SNAPSHOT ISOLATION обновлять только неблокированные строки? - PullRequest
0 голосов
/ 04 августа 2011

Большая таблица SQL Server 2008 обычно обновляется небольшими порциями с использованием транзакции SNAPSHOT ISOLATION. Снимок работает очень хорошо для этих обновлений, так как блоки никогда не перекрываются. Эти обновления представляют собой не одну длительную операцию, а множество небольших однострочных вставок / обновлений, сгруппированных по транзакции.

Я бы хотел, чтобы транзакция с более низким приоритетом обновила все строки, которые в данный момент не заблокированы. Кто-нибудь знает, как я могу получить это поведение? Произойдет ли сбой другой транзакции SNAPSHOT ISOLATION, как только произойдет столкновение строки, или он обновит все, что может, до сбоя?

Может ли SET DEADLOCK_PRIORITY LOW с попыткой поймать какую-нибудь помощь? Может быть, в цикле повтора с WHERE, который нацелен только на строки, которые не были обновлены?

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Изоляция моментальных снимков на самом деле не работает таким образом; Оптимистическая модель блокировки означает, что она не будет проверять блокировки или конфликты, пока не будет готова к записи / фиксации. Вы также не можете установить приоритет запроса как таковой и не можете использовать подсказку READPAST при обновлении.

Каждое обновление является неявной атомарной транзакцией, поэтому, если 1 обновление из 10 завершается неудачно (в одной транзакции), все они откатываются.

SET DEADLOCK_PRIORITY только устанавливает предпочтение, для которого транзакция откатывается в случае обратной блокировки (в противном случае выбирается «самый дешевый» откат).

Попытка поймать - это требование, если вы ожидаете регулярных столкновений.

Цикл повтора будет работать как при использовании другой модели блокировки и подсказки NOWAIT для пропуска запросов, которые будут заблокированы.

0 голосов
/ 04 августа 2011

Транзакция SNAPSHOT ISOLATION завершается неудачно, как только возникает конфликт обновления.Однако я бы использовал некоторую очередь за пределами базы данных для определения приоритетов обновлений.

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