次のことを行う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;
最初の質問:
この関数を同時に2回呼び出した場合、の最初の呼び出しがまだ実行されている間に、の2番目の呼び出しでテーブルfoobar()
を削除することは可能ですか?tmp_foobar
foobar()
SELECT
ステートメントがロックを作成することを理解していACCESS SHARE
ますが、そのロックは、ステートメントが完了するまで、または関数の最後にSELECT
暗黙的に示されるまで持続しますか?COMMIT
2番目の質問:
後者が当てはまる場合、ロックが解除されるまで2回目の呼び出しをfoobar()
無期限に再試行DROP TABLE IF EXISTS tmp_foobar;
しますか、それともある時点で失敗しますか?