比方说,我已经写了PLPGSQL函数执行以下操作:表在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的背景吗? – 2013-02-08 19:45:09
@a_horse_with_no_name我的问题是一个小规模的例子,并不代表我们真实的代码。我们使用临时表的原因超出了这个问题的范围。 – 2013-02-08 20:38:54