首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgres函数/存储过程中的条件锁定

Postgres函数/存储过程中的条件锁定
EN

Stack Overflow用户
提问于 2020-05-12 21:55:03
回答 1查看 310关注 0票数 2

我正在为一个网络爬虫构建一个事件采购服务,其中有几个爬虫工人抓取几个网站,并试图为抓取的资源保留增量。我选择了PostgreSQL作为底层数据存储。我需要让生产者能够使用名为"expectedSeq“的标志来控制是否应该为特定的流编写事件,从而实现乐观锁定。最初,我使用一个表,利用事务的自动增量为每个“流”构建乐观锁定功能,但我很快发现,服务器可以处理的表数有一个文件系统上限。

由于我不能再使用自动增量,因此我尝试使用两个表构建此功能,一个用于控制流的顺序,另一个用于存储事件本身。

我的第一个问题是,我应该使用存储过程还是函数。第二种可能是在存储过程或Postgres函数中包含条件事务。

我需要实现的逻辑是这样的

代码语言:javascript
运行
复制
storeEvent(stream, expectedSeq = null)

lock row for `streams`.stream

if expectedSeq = null
  update stream row with seq + 1
  release lock
  write event to event table
else
  if expectedSeq != seq + 1
    release lock
    abort
  else
    update seq + 1
    release lock
    write event to event table
EN

回答 1

Stack Overflow用户

发布于 2020-05-22 18:57:33

感谢伊恩·哈里斯

代码语言:javascript
运行
复制
CREATE OR REPLACE PROCEDURE store_event (v_topic varchar(40), v_expected_next_seq integer, v_data text)
LANGUAGE plpgsql
AS $$
DECLARE
  next_seq integer;
BEGIN
  -- FOR UPDATE clause places row level lock on table
  next_seq := (
    SELECT
      seq
    FROM
      topics
    WHERE
      topic = v_topic
    FOR UPDATE) + 1;
  IF v_expected_next_seq IS NOT NULL AND next_seq != v_expected_next_seq THEN
    RAISE 'Optimistic locking error';
  END IF;
  IF next_seq IS NULL THEN
    RAISE 'Unknown topic';
  END IF;
  UPDATE
    topics
  SET
    seq = next_seq
  WHERE
    topic = v_topic;
  INSERT INTO events (topic, seq, data)
    VALUES (v_topic, next_seq, v_data);
  COMMIT;
END;
$$;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61753562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档