Может ли обновление столбца с противопоказанием ключа foregin заблокировать ссылочную таблицу? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть одна таблица, которая сильно обновляется в моей системе процессом А. Это упрощенная таблица:

db=# \d employee;
                                       Table "public.employee"
     Column      |            Type             | Collation | Nullable |                   Default
-----------------+-----------------------------+-----------+----------+---------------------------------------------
 id              | integer                     |           | not null | nextval('employee_id_seq'::regclass)
 name            | character varying           |           |          |

Indexes:
"employee_pkey" PRIMARY KEY, btree (id)

И у меня есть таблица, которая ссылается на эту таблицу:

db=# \d employee_property;
                                       Table "public.employee_property"
     Column      |            Type             | Collation | Nullable |                   Default
-----------------+-----------------------------+-----------+----------+---------------------------------------------
 id              | integer                     |           | not null | nextval('employee_property_id_seq'::regclass)
 type            | character varying           |           |          |
 value           | character varying           |           |          |
 employee_id     | integer                     |           | not null |

Indexes:
    "employee_property_pkey" PRIMARY KEY, btree (id)
    "employee_property_employee_id_type_value_key" UNIQUE CONSTRAINT, btree (employee_id, type, value)
    "ix_employee_property_employee_id" btree (employee_id)
Foreign-key constraints:
   "employee_property_employee_id_fkey" FOREIGN KEY (employee_id) REFERENCES employee(employee_id) ON DELETE CASCADE DEFERRABLE

Я пытаюсь понять, сильно ли я обновляю таблицу employee_property процессом B в системе, может ли это вызвать некоторые блокировки или другие побочные эффекты, которые могут повлиять на процесс A, который обновляет таблицу сотрудников?

1 Ответ

0 голосов
/ 18 декабря 2018

Если вы вставляете строку в employee_property или обновляете столбец employee_id существующей строки, в строку помещается блокировка FOR KEY SHARE, к которой относится новый employee_id.

Эта блокировказаблокирует любую одновременную попытку удалить указанную строку employee или обновит столбцы PRIMARY KEY или UNIQUE.Обновления заблокированной строки employee, которые не изменяют ключевой столбец, будут работать, поскольку для них требуется только блокировка FOR NO KEY UPDATE для строки, совместимая с FOR KEY SHARE.

. Причина этого заключается в том, чточто PostgreSQL должен гарантировать, что указанная строка не может исчезнуть, пока транзакция, которая изменяет employee_property, все еще выполняется.Простая проверка ссылок на строки в employee будет недостаточной, поскольку эффекты транзакции, которая все еще выполняется, не видны вне самой транзакции.

...