gpt4 book ai didi

postgresql - 在 plpgsql 函数中锁定表

转载 作者:行者123 更新时间:2023-11-29 12:47:06 25 4
gpt4 key购买 nike

假设我编写了执行以下操作的 plpgsql 函数:

CREATE OR REPLACE FUNCTION foobar (_foo_data_id bigint)
RETURNS bigint AS $$
BEGIN

DROP TABLE IF EXISTS tmp_foobar;

CREATE TEMP TABLE tmp_foobar AS
SELECT *
FROM foo_table ft
WHERE ft.foo_data_id = _foo_data_id;

-- more SELECT queries on unrelated tables

-- a final SELECT query that invokes tmp_foobar

END;

第一个问题:

如果我同时调用这个函数两次,第二次调用 foobar() 是否有可能删除 tmp_foobar 表,而第一次调用 foobar () 还在运行吗?

我知道 SELECT 语句会创建一个 ACCESS SHARE 锁,但该锁会持续到 SELECT 语句完成或隐含的 COMMIT 在函数的末尾?

第二个问题:

如果后者为真,第二次调用 foobar() 是否会无限期地重试 DROP TABLE IF EXISTS tmp_foobar; 直到锁被删除或失败在某个时候?

最佳答案

如果您同时调用一个函数两次,这意味着您正在使用两个单独的 session 来执行此操作。临时表不在 session 之间共享,因此第二个 session 不会从第一个 session “看到”tmp_foobar,并且不会有交互。参见 http://www.postgresql.org/docs/9.2/static/sql-createtable.html#AEN70605 (“临时表”)。

锁一直存在到事务结束(无论您如何获取它们;建议锁除外,但这不是您正在做的。)

第二个问题不需要回答,因为前提是错误的。

还有一件事。在您的临时表上创建索引并对其进行分析可能很有用;这可能会导致最终查询更快。

关于postgresql - 在 plpgsql 函数中锁定表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14779048/

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