2010-07-07 4 views
1

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

Мой вопрос:

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

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

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

+3

«Скажем, я хочу реализовать базу данных с системой блокировки» - это высокий порядок .... –

+1

Я на самом деле этого не делаю, не волнуйся ^^ – Viele

ответ

4

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

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

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

+0

Привет, Дэниэл, не могли бы вы рассказать о том, как интегрировать STM с транзакцией db? Мне действительно интересно. – Viele

0

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

1

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

Смежные вопросы