Re: Strange deadlock in foreign key check

Поиск
Список
Период
Сортировка
От Adrian Klaver
Тема Re: Strange deadlock in foreign key check
Дата
Msg-id 55C38F73.6040307@aklaver.com
обсуждение исходный текст
Ответ на Re: Strange deadlock in foreign key check  (Sophia Wright <sjw9010@gmail.com>)
Ответы Re: Strange deadlock in foreign key check
Список pgsql-general
On 08/06/2015 09:29 AM, Sophia Wright wrote:
> On Fri, Aug 7, 2015 at 1:11 AM, Alvaro Herrera <alvherre@2ndquadrant.com
> <mailto:alvherre@2ndquadrant.com>> wrote:
>
>     Sophia Wright wrote:
>     > I am seeing some odd locking behaviour when deleting a parent record
>     > (Postgres 9.4.4).
>
>     Somewhere in the triggers for FK checks we do "SELECT FOR KEY SHARE" of
>     the PK tuples when the FK tuples are altered; and conversely when we
>     remove tuples from the PK side we need to ensure that there are no
>     referencing tuples in the FK side.  The code doesn't distinguish between
>     indexes used in foreign keys from other indexes that *could* be used in
>     foreign keys.  Therefore your UNIQUE in the declaration for "x" may be
>     making it difficult for you.  I don't have the time to go through this
>     right now, but please try and see what happens if you remove the UNIQUE
>     from that column.
>
>     We discussed about only considering indexes actually referenced by
>     foreign keys instead of all of them, but there are some fine points to
>     keep in mind if you do that, so we never got around to implementing that
>     optimization.  I don't have any immediate suggestion for what to do to
>     work around this issue.
>
>
> Thanks. Removing the UNIQUE constraint prevents this, but I'm still not
> clear on why it happens...
>
> Based on your explanation, I can see how a UNIQUE index on the PK side
> would cause problems. But on the FK side, I'm not sure where this fits
> in. Why lock the UNIQUE field, but not lock the FK field itself? Isn't
> it the only part that's relevant here?

I would also take a look at Alvaro's explanation. My understanding is
that for locking purposes the UNIQUE index is considered sort of like a
FK, as it could be used as a FK. This then leads to the FOR UPDATE lock,
which from Table 13.3 at the link I sent, conflicts with all the other
row locks.



--
Adrian Klaver
adrian.klaver@aklaver.com


В списке pgsql-general по дате отправления:

Предыдущее
От: Luca Ferrari
Дата:
Сообщение: Re: Oracle baseline/baseplan/outplan in Postgres
Следующее
От: Jim Nasby
Дата:
Сообщение: Re: multiple postgres processes after establishing tcp connection