문제

구현을 위해서는 특정 쓰기가 대량으로 수행되어야 하며 다른 간섭이 발생하지 않아야 합니다.

나는 있었다 말했다 이러한 방식으로 두 개의 경쟁 거래가 첫 번째 거래가 두 번째 거래를 차단하게 되고 두 번째 거래는 첫 번째 거래 이후 완료될 수도 있고 완료되지 않을 수도 있습니다.

이를 확인하는 문서를 게시해 주세요.또한 첫 번째 거래가 차단되면 두 번째 거래는 정확히 어떻게 되나요?대기 상태에 놓이게 될까요, 실패할까요, 아니면 어떤 조합이 될까요?

이를 확인할 수 없는 경우 이 트랜잭션에 대한 트랜잭션 격리 수준을 다음으로 설정해야 합니다. SERIALIZABLE?그렇다면 libpqxx 준비된 명령문을 사용하여 어떻게 이를 수행할 수 있습니까?

트랜잭션이 직렬화되면 두 번째 트랜잭션이 실패합니까, 아니면 첫 번째 트랜잭션이 완료될 때까지 대기하게 됩니까?

둘 중 하나라도 실패하면 libpqxx로 이를 어떻게 감지할 수 있습니까?

도움이 되었습니까?

해결책

동시성 효과를 최종적으로 방지하는 유일한 방법은 다음과 같습니다. LOCK TABLE ... IN ACCESS EXCLUSIVE MODE 수정하려는 각 테이블.

이는 실제로 한 번에 한 가지 일만 하고 있음을 의미합니다.또한 항상 동일한 순서로 잠금을 획득하지 않으면 교착 상태와 관련된 재미있는 문제가 발생합니다.

따라서 일반적으로 수행하려는 작업이 정확히 무엇인지, 그리고 해당 작업이 어떻게 상호 작용하는지 파악해야 합니다.허용할 수 있는 동시성 효과와 허용할 수 없는 효과를 방지하는 방법을 결정합니다.

이 질문은 현재로서는 너무 광범위해서 유용하게 답변할 수 없습니다.

옵션은 다음과 같습니다:

  • 테이블을 독점적으로 잠급니다.(이것이 유일한 방법 현재 PostgreSQL에서 동시성 문제 없이 다중 행 upsert를 수행하려면).잠금 업그레이드 및 잠금 순서 관련 교착 상태에 주의하세요.

  • 적절한 사용 SERIALIZABLE 격리 - 하지만 기억하세요. 트랜잭션 중에 수행한 작업에 대한 기록을 유지하고 tx가 중단되면 다시 시도할 수 있어야 합니다.

  • 신중한 행 수준 잠금 - SELECT ... FOR UPDATE, SELECT ... FOR SHARE.

  • 적절한 경우 "낙관적 잠금"/낙관적 동시성 제어

  • 동시 작업에 더 친숙하게 만드는 방식으로 쿼리를 작성합니다.예를 들어 읽기-수정-쓰기 주기를 내부 업데이트로 대체합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top