Postgresql тупик из не связанных напрямую таблиц - PullRequest
0 голосов
/ 02 марта 2020

Работает postgresql 11.2

У меня есть 3 таблицы, Table1, Table2 и Table3.

Table2 и Table3 связаны с Table1.

Итак, оба у меня есть внешний ключ и поле для этого:

"fk38dc51d86836z0e5" FOREIGN KEY (table1_id) REFERENCES table1(id)

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

Process 19819 waits for ShareLock on transaction 254244062; blocked by process 19930.
    Process 19930 waits for ShareLock on transaction 254244063; blocked by process 19819.
    Process 19819: update Table1 set lastUpdated=$1, user_id=$2 where id=$3
    Process 19930: update Table2 set lastUpdated=$1, version=$2, content=$3, extra=$4 where id=$5 and version=$6

единственной связью между этими двумя таблицами является их связь с таблицей1. Они не связаны напрямую друг с другом.

Но ни один из запросов не использует внешний ключ для Table1 как часть своего запроса.

Что здесь происходит? Почему вообще тупик?

1 Ответ

1 голос
/ 02 марта 2020

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

Например, в сеансе 1:

postgres=# begin;
BEGIN
postgres=# update t1 set x=1 where x=0;
UPDATE 1
postgres=# update t2 set x=1 where x=0;
UPDATE 1
postgres=# 

И в сеансе 2:

postgres=# begin;
BEGIN
postgres=# update t2 set x=2 where x=0;
UPDATE 1
postgres=# update t1 set x=2 where x=0;
ERROR:  deadlock detected
DETAIL:  Process 26871 waits for ShareLock on transaction 191533; blocked by process 26777.
Process 26777 waits for ShareLock on transaction 191534; blocked by process 26871.
HINT:  See server log for query details.
CONTEXT:  while updating tuple (0,3) in relation "t1"
postgres=# 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...