【发布时间】:2013-01-24 14:25:53
【问题描述】:
假设我编写了执行以下操作的 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; 直到锁被删除还是会在某个时候失败?
【问题讨论】:
-
一开始我不会使用临时表。如果单个(大)SELECT 更快,我不会感到惊讶。您是否具有 SQL Server 背景?
-
@a_horse_with_no_name 我的问题是一个小规模的例子,并不代表我们的真实代码。我们使用临时表的原因超出了这个问题的范围。
标签: postgresql plpgsql postgresql-9.2 table-locking