gpt4 book ai didi

postgresql - PostgreSQL 函数是原子的吗? (ID生成)

转载 作者:行者123 更新时间:2023-11-29 14:21:16 26 4
gpt4 key购买 nike

假设我在 PostgreSQL 中有以下存储过程。 (请注意,这不是真正的代码。我知道这可以用另一种更好的方式完成,这只是一个例子来说明我的问题)

CREATE FUNCTION testFunction( ) RETURNS integer AS $$
DECLARE iNewID integer;
BEGIN
SELECT CurrentID INTO iNewID FROM TestTable; // statement 1

iNewID := iNewID + 1;

UPDATE TestTable SET CurrentID=iNewID; // statement 2

RETURN iNewID;
END; $$
LANGUAGE PLPGSQL;

假设两个不同的用户几乎同时运行它。他们可以获得相同的 ID 吗?

我会尝试换句话说。在代码中,我注释了两个语句。如果两个用户同时运行这个。调用语句的顺序是什么。我能确定它会是这样吗:

  • 用户A陈述1
  • 用户A陈述2
  • 用户B声明1
  • 用户B陈述2

或者可以这样(导致相同的 ID):

  • 用户A陈述1
  • 用户B声明1
  • 用户A陈述2
  • 用户B陈述2

希望您能理解我的问题。我真的试图在网上搜索这个问题的答案,但没有运气。这可能是因为我没有这个名字?这叫什么?

非常感谢您的帮助。

最佳答案

Let's say that two different users run this at almost the same time. Can they get the same ID returned?

当然可以。这就像您在事务外将其作为两个单独的语句运行一样,在您的应用程序中进行添加。

I wrote about this recently .

使用 SEQUENCE以确保唯一 ID。 SERIAL伪类型使这更容易。请注意,不保证 ID 是无间隙的;像这样的 ID 是正常的:1、3、4、5、6、9、10、11、14,.. 如果事务回滚,服务器将重新启动等。

如果这对你来说是个问题,你会想改为:

SELECT CurrentID INTO iNewID FROM TestTable FOR UPDATE;
... blah blah ...

... 这将锁定该行,以便其他事务无法更新它,直到当前事务提交或回滚。这实际上可以使用 PostgreSQL 特定的功能简化为:

  UPDATE TestTable
SET CurrentID = iNewID
RETURNING CurrentID;

然后您可以将其包装在 SQL 函数中或使用 RETURN QUERY 在 PL/PgSQL 中运行。

关于postgresql - PostgreSQL 函数是原子的吗? (ID生成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25958548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com