2016-08-02 1 views
1

나는 독특한 제품 만 가지고있는 쇼핑 웹 사이트에서 일하고 있습니다. 따라서 사용자는 동시에 동일한 제품을보고 카트에 추가 할 수 있지만 주문할 때 누구든지 먼저 카트를 올리면 같은 품목이 카트에 추가됩니다.특정 코드 조각을 잠그는 법 C#

하지만 전화를 걸면 내 장소 주문 코드가 잠기고 다른 모든 요청은 완료되지 않을 때까지 대기열에서 대기해야한다는 점을 어떻게 문제가 있습니다. lock 키워드에 대해서는 읽었지만별로 생각하지 않았습니다. 어떤 도움을 주시면 감사하겠습니다.

1 단계 :

다음은 내 코드에 대한 몇 가지 단계는 해당 항목을 사용할 수 없거나 볼 수있는 제 3 자 서비스를 호출하지 2 단계 : 항목을 사용할 수있는 경우 다음 호출하여 구매하는 제 3 자 서비스 . 3 단계 : 성공적으로 구입 한 경우 플래그 등으로 데이터베이스를 업데이트하십시오.

+0

코드 샘플을 제공해 주시겠습니까? –

+0

근본적인 디자인 상 결함이있는 것 같습니다. 요청이 서로 간섭하지 않아야하며 작동시키기 위해 어떤 종류의 잠금도 수행하면 안됩니다. 코드를 보면 잘못된 점을 파악하는 데 도움이됩니다. – itsme86

+0

이것은'lock'을위한 것이 아닙니다. 인물이 장바구니에있는 동안 항목을 재고에서 일시적으로 '제거'하는 방법이 필요합니다 (귀하의 질문이 올바르게 이해 된 경우). 내가 생각할 수있는 가장 좋은 방법은 데이터베이스에 카트를 넣는 것입니다. 그러면 카트에 대해 항상 쿼리하여 잠재적 인 주식이 무엇인지 확인할 수 있습니다. –

답변

4

여러 웹 요청이 서로 다른 프로세스에서 실행될 수 있기 때문에 코드를 안전하게 잠글 수 없습니다 (적어도 나중에 서버를 업그레이드 할 때) .

대신 데이터베이스 변경 사항은 한 번만 성공하고 두 번 째 요청은 정상적으로 실패를 처리해야합니다. 데이터베이스 변경 사항은 "자연스럽게"원 자성이므로 일부 스마트 삽입/업데이트로 문제가 해결됩니다.

+0

@mattis : 데이터베이스 업데이트뿐만 아니라 외부 API도 거의 필요하지 않습니다. – ChupChapCharli

+1

그래서 거래를 시작하십시오. db 업데이트를 수행하십시오. 성공하면 외부 API를 계속 진행합니다. 성공하면 거래를 커밋합니다. 그렇지 않으면 롤백하여 사용자에게 오류를 표시하십시오. –

+0

고마워. 그럼, 만약 당신이 데이터베이스에 플래그를 업데이 트 해야하는 항목을 사용할 수있는 다음 외부 API를 타격하여 구매하려고, 그래서 그 항목에 대한 다른 요청을 사용할 수있는 트랜잭션 롤백하지 않는 표시됩니다 어떤 오류. 내가 오해하는 경우에 저를 정정하십시오. – ChupChapCharli