>source

Postgres (중요한 경우 11)에서는 SELECT FOR UPDATE 이후에 몇 가지 변경 작업을 수행 할 행 모음을 가져오고 이러한 변경 작업을 수행하는 동안 트랜잭션 외부의 누군가가 엉망이되는 것을 원하지 않습니다.

그러나 잠 그려는 행 집합은 실제로 집합 차이에 의해 정의됩니다.

SELECT <columns> FROM table1 t1 JOIN table2 t2 ON ... WHERE ...
EXCEPT
SELECT <columns> FROM table1 t1 JOIN table3 t3 ON ... WHERE ...

이 집합 차이의 결과 집합이 잠긴 행 집합을 결정하기를 원합니다. 즉, 두 번째로 선택된 행 SELECT 이상적으로아니잠기다.

하지만 어디에 넣을지 잘 모르겠습니다. FOR UPDATE 이를 달성하기 위해 절. 그것은 넣어 것 같습니다 FOR UPDATE 다음 중 하나 바로 다음에 SELECT 위의 줄은 내가 원하는 것을 제공하지 않습니다. 그리고 사실 나는 내가캔트합법적으로 첫 번째 뒤에 넣어 SELECT 줄 (즉, EXCEPT ).

나에게 떠오른 한 가지 아이디어는 두 번째 SELECT (의 주제 인 EXCEPT ), 그래서 FOR UPDATE 그 초의 일부로 해석되지 않습니다 SELECT :

SELECT <columns> FROM table1 t1 JOIN table2 t2 ON ... WHERE ...
EXCEPT
(SELECT <columns> FROM table1 t1 JOIN table3 t3 ON ... WHERE ...)
FOR UPDATE

그러나 그것이 구문 상 허용되는 것으로 판명 되더라도 그것이 내가 원하는 것을 제공하는지 확신하지 못합니다.

(Postgres) select 문에 대한 구문 분석 트리의 모양에 대한 아이디어가 있다면 직접 쉽게 알아낼 수있을 것입니다. 하지만 지금은 조금 길을 잃었습니다.


  • 답변 # 1

    사용할 수 없습니다 FOR UPDATE 함께 UNION , INTERSECT 또는 EXCEPT , 이는 일반적인 경우에 모호성을 유발할 수 있기 때문입니다.

    두 가지 접근 방식을 생각할 수 있습니다.

    사용하다 EXISTSNOT EXISTS :

    SELECT ... FROM table1
    WHERE EXISTS (SELECT 1 FROM table2 ...
                  WHERE table2.x = table1.x AND ...)
      AND NOT EXISTS (SELECT 1 FROM table3 ...
                      WHERE table3.y = table1.y AND ...)
    FOR UPDATE OF table1;
    
    

    하위 쿼리를 사용합니다.

    SELECT ... FROM table1
    WHERE id IN (SELECT t1.id
                 FROM table1 t1 JOIN table2 t2 ON ...
                 WHERE ...
                 EXCEPT
                 SELECT t1.id
                 FROM table1 t1 JOIN table3 t3 ON ...
                 WHERE ...)
    FOR UPDATE OF table1;
    
    

관련 자료

  • 이전 css - div가 축소 될 때 내 div 내부의 콘텐츠가 왜 긁히는 지 알 수 없습니다
  • 다음 github에서 html 파일을 호스팅하는 동안 오류가 발생했습니다