Postgresql 锁和 copy_expert

Posted

技术标签:

【中文标题】Postgresql 锁和 copy_expert【英文标题】:Postgresql locks and copy_expert 【发布时间】:2020-05-19 23:18:07 【问题描述】:

我正在使用 cursor.copy_expert 命令将数据复制到几个 postgresql 表中。加载数据后,当我运行以下查询时,我看到这些表的模式设置为“AccessShareLock”、“RowExclusiveLock”、“ShareUpdateExclusiveLock” -

select t.relname,l.locktype,page,virtualtransaction,pid,mode,granted from pg_locks l, pg_stat_all_tables t where l.relation=t.relid order by relation asc;

这些表是否被 copy_expert 命令锁定,不同的表如何与不同的锁关联?

【问题讨论】:

【参考方案1】:

在出现此问题的情况下,提交所有在关系级别调整 autovacuum 和 auto-analyze 的参数都已更新为使用 SHARE UPDATE EXCLUSIVE LOCK。简而言之,这允许读取和写入操作与 ALTER TABLE 并行发生,这肯定有助于利用此类关系上的活动膨胀。

ALTER TABLE mytable
   SET (vacuum_truncate = on,
        toast.vacuum_truncate = on);

ALTER TABLE SET autovacuum storage options

还请注意,当使用多个子命令时,在 ALTER TABLE 命令的持续时间内会采用整个集合的更强锁定。因此,例如,如果参数 fillfactor 的更新与 autovacuum_enabled 的修改混合在一起,则将在关系上采用 ACCESS EXCLUSIVE 锁而不是 SHARE UPDATE EXCLUSIVE 锁。 ALTER TABLE 使用以下一组锁,那些具有单调关系的锁可以建立它们的层次结构,最强的是这里列出的第一个:

访问独占锁

共享行独占锁

共享更新独占锁

sql vacuum

【讨论】:

以上是关于Postgresql 锁和 copy_expert的主要内容,如果未能解决你的问题,请参考以下文章

postgresql 有悲观锁和乐观锁吗

PostgreSQL temp table 全链路 实现原理

关于MySQL中的表锁和行锁

mysql深入理解全局锁和表锁解决MDL锁和死锁问题

mysql深入理解全局锁和表锁解决MDL锁和死锁问题

Mysql的锁(S锁和X锁的区别)