2010-06-14 2 views
2

저는 현재 고객을 위해 PHP 전자 상거래 웹 사이트를 구축 중입니다. 그것은 원활하게 진행되었지만 막대한 타격을 입 었으며 MySQL/PHP 전문가가 저를 도울 수 있는지 궁금합니다. 기본적으로 전자 상거래 사이트에서는 한 번만 제품을 판매합니다. 즉, 각 품목에 대해 재고 수량이 하나뿐이므로 고객이 해당 품목을 체크 아웃하면 더 이상 구매할 수 없습니다.업데이트를 선택하고 전자 상거래를 수행 한 다음 PHP로 MySQL 저장 프로 시저를 호출 할 수 있습니까?

따라서 결제 할 때 제품이 아직 재고가 있는지 확인해야합니다. 이 사이트가 트래픽이 많은 사이트라고 가정하면 두 명 이상의 고객이 동시에 결제를 시도하여 둘 다 제품을 구매할 수있는 경우가있을 수 있습니다. 그래서, 내 계획은 다음과 같습니다 :

  1. 선택 ... 테이블 행을 잠그기 위해 제품의 ... FOR UPDATE.
  2. 전자 상거래 (Paypal, authorize.net 등)
  3. 전자 상거래가 성공하면 주문 정보 등을 저장하는 MySQL 저장 프로 시저 (SQL 트랜잭션도 있음)를 호출하십시오. 롤백 실패시

이 계획을 실현할 수 있습니까? SELECT ... FOR UPDATE를 수행하려면 SQL 트랜잭션을 시작해야하지만 MySQL 저장 프로 시저 내에서 3 단계에서 다른 트랜잭션을 시작합니다. 무슨 일이 일어날 지 모르겠습니다. 또한,이 계획은 교착 상태 시나리오로 이어질 것인가?

오랜 질문을 드려 죄송합니다.

+0

''업데이트 선택 '대신'tinyint (1)'처럼 사용할 수있는 항목이 있다고 생각합니다. 항목에 플래그를 지정하는 것이 더 좋은 선택 일 수 있습니다. 'select for update'를 사용하면 교착 상태가 발생할 가능성은 없지만 구매 버튼을 클릭 한 고객 # 2는 (고객 # 1이 잠금을 유지하는 동안) 오랜 시간 동안 기다릴 가능성이 높습니다. 죄송 합니다만, 우리는 재고가 없습니다. " –

+0

필자는 사용 가능한 열에 대해 생각했지만 두 고객이 동시에 "Buy"를 클릭했다고 가정하고 두 요청 모두 "사용 불가능"으로 업데이트되기 전에 열을 "사용 가능"으로 반환하지 않을까요? – user366343

+0

죄송합니다. 분명치 않다면'select for update'를 사용하여 사용 가능한 열을 업데이트한다고 말했어야합니다. 이렇게하면 전체 프로세스를 잠그지 않고 가용성 만 확인하면서 잠글 수 있습니다. 다른 옵션은 사용 가능한 컬럼에 대한 첫 번째 점검 후에 갱신 할 때 update tbl set available = 0 where id = 1 및 available = 1'과 같은 작업을 수행하는 것입니다. 두 사람이 동시에 쿼리를 실행하면 1 번만 성공해야합니다. 그런 다음 업데이트의 영향을받은 행 수를 확인할 수 있습니다. 0 행이 영향을 받으면 부딪 혔습니다. –

답변

0

저장 프로 시저에 트랜잭션 제어가 없어야한다고 제안합니다. 그것은 당신의 어려움의 원인 인 것 같습니다.

다른 호출자가 이와 같은 저장 프로 시저를 필요로하는 경우 '저장'을 새 저장 프로 시저로 분해하는 것을 고려하십시오.

관련 문제