집 >데이터 베이스 >MySQL 튜토리얼 >PL/pgSQL에서 동시 `SELECT` 및 `INSERT` 작업이 경쟁 조건으로 이어질 수 있습니까?
SELECT
또는 INSERT
작업이 경쟁 조건에 취약합니까? PL/pgSQL 함수에서 Posts
테이블에 데이터를 삽입하고 태그를 반복하여 Tags
및 Taggings
테이블에 삽입합니다. 여러 사용자가 동시에 태그를 삭제하고 게시물을 작성하려고 하면 이 프로세스에서 경쟁 조건이 발생할 수 있다는 점이 우려됩니다.
동시 쓰기 로드에서는 테이블에 새 행을 삽입하려고 하지만 이미 존재하는 행을 검색하려고 할 때 "SELECT
또는 INSERT
" 개념이 발생합니다. SQL에서는 INSERT ... ON CONFLICT ... DO SOMETHING
문을 사용하여 이를 수행할 수 있습니다.
귀하의 함수는 Tags
테이블에 태그를 삽입할 때 이 기술을 사용하지만, 트랜잭션이 커밋되기 전에 다른 트랜잭션이 관련 태그를 삭제하면 경쟁 조건이 발생할 수 있습니다. 이를 방지하려면 다음 기술을 고려하십시오.
SELECT
문에서 FOR SHARE
을 사용하여 기존 행을 잠그면 트랜잭션이 진행되는 동안 다른 트랜잭션이 해당 행을 수정할 수 없도록 합니다. LIMIT
UNION ALL
with : UNION ALL
쿼리를 사용하여 결과에 SELECT
절을 사용하여 INSERT
및 LIMIT 1
문을 결합합니다. 이 기술을 사용하면 행이 이미 존재하거나 삽입이 성공한 경우 빠르게 종료할 수 있습니다. INSERT
기능: 삽입 작업을 별도의 기능에 아웃소싱합니다. 이 함수는 필요한 모든 예외 처리를 처리해야 하는 반면, 주 함수는 전체 논리에 중점을 둡니다. 이러한 방법 중 하나를 구현하면 함수의 경합 상태를 방지하고 데이터베이스의 데이터 무결성을 보장할 수 있습니다.
위 내용은 PL/pgSQL에서 동시 `SELECT` 및 `INSERT` 작업이 경쟁 조건으로 이어질 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!