Можно ли создать взаимоблокировку только между 2 транзакциями и 1 ресурсом? - PullRequest
0 голосов
/ 15 июня 2019

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

Взяв в качестве примера следующий график:

r 1 (x) r 2 (x) w 1 (x) w 2 (x)

Возможно возникновение тупика?Я рассуждаю так: да, это может произойти, потому что транзакция 1 и транзакция 2 будут иметь общие блокировки для ресурса x, что не позволит ни одной из транзакций продолжить запись.

Так я прав или ответ в добавленной мной ссылке правильный?

1 Ответ

0 голосов
/ 20 июня 2019

Вопрос сводится к тому, как вы определяете «ресурс».В вашем примере есть один объект X, из которого два потока читают и пишут.Если бы для объекта X был только один тип блокировки, то поток 2 не смог бы получить его при чтении, без тупика.

Аналогично, если блокировка требуется только для записи (поэтому нет гарантииповторяющиеся чтения), тогда запись потока 2 будет просто записью записи потока 1.Опять же, без тупиков.

Но в вашем примере есть два вида блокировок для одного объекта.«Ресурс» здесь - это блокировка, и их две: блокируемая блокировка чтения и эксклюзивная блокировка записи.

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

...