Что должно произойти при обнаружении тупика - PullRequest
1 голос
/ 07 июля 2010

Скажем, я хочу реализовать базу данных с системой блокировки, и я использую предотвращение блокировок и пытаюсь избежать потенциальной тупиковой ситуации до ее получения.

Мой вопрос:

Когда сеанс / транзакция уже успешно получила некоторый ресурс A, и теперь она пытается получить блокировку для ресурса B, когда обнаружена взаимоблокировка.

Следовательно, сеанс терпит неудачу при получении блокировки на B, должна ли система заставить сеанс отказаться от других ресурсов, которые сеанс удерживает, в этом случае: A, и сделать сеанс недействительным?

Или есть другой, более стандартный способ справиться с этой ситуацией?

Ответы [ 3 ]

4 голосов
/ 07 июля 2010

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

Но если транзакция была открыта на каком-либо языке программирования, база данных не сможет повторно выполнить весь код с начала транзакции; поэтому все, что он может сделать, это сообщить приложению, что произошла тупиковая ситуация. Разработчик приложения должен написать код, чтобы повторить всю транзакцию.

Обратите внимание, что если приложение использует что-то вроде Программная транзакционная память , приложение может интегрироваться в транзакцию базы данных и автоматически откатывать состояние приложения и повторять всю транзакцию.

1 голос
/ 07 июля 2010

SQL Server работает с взаимоблокировками, аналогичными описанным вами, - он выберет один из двух сеансов в качестве жертвы взаимоблокировки и завершит / аннулирует сеанс.

0 голосов
/ 07 июля 2010

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

...