【问题标题】:Does updating a column with foregin key contraint can lock the referenced table?使用外键约束更新列是否可以锁定引用的表?
【发布时间】:2019-05-19 00:25:45
【问题描述】:

我有一张表,它在我的系统中被进程 A 大量更新。这是简化表:

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

我想了解如果我在系统中通过进程 B 大量更新 employee_property 表,是否会导致一些锁定或任何其他可能影响更新员工表的进程 A 的副作用?

【问题讨论】:

    标签: postgresql foreign-keys database-locking postgres-10


    【解决方案1】:

    如果您在employee_property 中插入一行或更新现有行的employee_id 列,则会在新employee_id 所指的行上放置FOR KEY SHARE 锁。

    此锁将阻止任何并发尝试删除引用的employee 行或更新任何PRIMARY KEYUNIQUE 列。对锁定的employee 行进行不修改键列的更新将起作用,因为它们只需要对行进行FOR NO KEY UPDATE 锁定,这与FOR KEY SHARE 兼容。

    这样做的原因是 PostgreSQL 必须确保在修改 employee_property 的事务仍在进行时,引用的行不会消失。仅检查 employee 中的引用行是不够的,因为仍在进行中的事务的影响在事务本身之外是不可见的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-27
      • 2012-12-19
      • 2014-02-06
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多