【问题标题】:postgres: delete before insert requires lock?postgres:在插入之前删除需要锁定?
【发布时间】:2020-06-25 14:44:40
【问题描述】:

我想替换客户的记录列表。似乎 postgres 没有处理我的情况的mergestatement 我决定按如下方式进行:

我像这样删除客户的所有记录

DELETE FROM SOME_TABLE WHERE SOME_TABLE.CLIENT_ID=?

然后插入一些新记录:

INSERT INTO SOME_TABLE (CLIENT_ID, ...) VALUES (1, ...), (2, ...)

我正在交易中这样做。

我的问题:我知道需要某种形式的同步(锁定或一定级别的事务隔离)的先读后写问题。

这是其中一种情况吗?

【问题讨论】:

  • 在 Postgres 中相当于 MERGE 是 insert ... on conflict (..) do update
  • @a_horse_with_no_name 感谢您的回复。这不是相同的用例,因为它不会“替换”记录列表。它会留下不包含在插入语句中的记录。
  • 你能给出一些粗略的数字/百分比吗?要做到这一点,必须删除多少行,更新多少行,插入多少行?运行过程中会发生什么样的并发访问?是否有单独的client 表?
  • @Ynv:您仍然可以在第二步中删除它们:dbfiddle.uk/…

标签: sql postgresql concurrency locking


【解决方案1】:

如果您没有太多的客户端,您可以通过client_id 对表进行分区。

然后为客户端替换数据可能会尽可能快:

BEGIN;
TRUNCATE some_table_partition_1;
COPY some_table_partition_1 (client_id, ...) FROM STDIN
   (FORMAT 'csv', FREEZE);
COMMIT;

分区将在操作期间自动锁定。

【讨论】:

  • “客户太多”是多少? 10, 1000, 1000000 ?
  • 对于 PostgreSQL v12,我将限制设置为几千。
猜你喜欢
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
相关资源
最近更新 更多