는이 전 다음을 수행 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
때까지 때까지 지속됩니다?
두 번째 질문 :
후자가 true의 경우, 잠금이 삭제 될 때까지 foobar()
의 두 번째 호출이 무기한 DROP TABLE IF EXISTS tmp_foobar;
을 다시 시도 할 것이다 또는 어떤 시점에서 실패?
나는 이것을 시작하기 위해 임시 테이블을 사용하지 않을 것이다. 하나의 (큰) SELECT가 더 빠르다면 놀랄 일이 아닙니다. SQL Server 배경에서오고 있습니까? –
@a_horse_with_no_name 제 질문은 소규모 사례이며 실제 코드를 나타내지는 않습니다. 임시 테이블을 사용하는 이유는이 질문의 범위를 벗어납니다. –