比方說,我已經寫了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