Как написать SQL для обновления и аннулировать Deadlock? - PullRequest
1 голос
/ 23 декабря 2011

Мне нужно очень часто выполнять этот SQL

UPDATE Users SET UserPoint=UserPoint+(@UserPoint) WHERE UserID=@UserID

Я могу разрешить грязное чтение или грязную запись, но я не хочу видеть тупик, есть ли способ увеличить шанс избежать тупика?

EDIT

Хорошо, @ Томтом, это может быть не тупик, это хорошая новость для меня.

Здесь я задаю новый вопрос, надеюсь, вы поможете.

Мне также нужно прочитать данные, поэтому я использую

SELECT UserPoint FROM [Users] WITH (NOLOCK) WHERE UserID=@UserID

Это не транзакция, а простой однострочный SQL, и я уже использую nolock, нужно ли мне использовать SET TRANSACTION ISOLATION LEVEL, чтобы избежать тупиков, если я разрешу «грязное чтение».

ВНОВЬ СНОВА

Я думаю, УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ, ЧТОБЫ ЧИТАТЬ БЕЗ КОММИТЕТА и С NOLOCK - это одно и то же. так сделано. Спасибо всем,

1 Ответ

3 голосов
/ 23 декабря 2011

есть ли способ увеличить шанс избежать тупика?

Нет, потому что это утверждение НЕ МОЖЕТ БЛОКИРОВАТЬ.

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

ЕСЛИ она не является частью более крупной транзакции с большим количеством операторов.

Итак, проблема не существует для начала;)

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