假设我编写了执行以下操作的 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;
直到锁被删除还是会在某个时候失败?