저는 현재 고객을 위해 PHP 전자 상거래 웹 사이트를 구축 중입니다. 그것은 원활하게 진행되었지만 막대한 타격을 입 었으며 MySQL/PHP 전문가가 저를 도울 수 있는지 궁금합니다. 기본적으로 전자 상거래 사이트에서는 한 번만 제품을 판매합니다. 즉, 각 품목에 대해 재고 수량이 하나뿐이므로 고객이 해당 품목을 체크 아웃하면 더 이상 구매할 수 없습니다.업데이트를 선택하고 전자 상거래를 수행 한 다음 PHP로 MySQL 저장 프로 시저를 호출 할 수 있습니까?
따라서 결제 할 때 제품이 아직 재고가 있는지 확인해야합니다. 이 사이트가 트래픽이 많은 사이트라고 가정하면 두 명 이상의 고객이 동시에 결제를 시도하여 둘 다 제품을 구매할 수있는 경우가있을 수 있습니다. 그래서, 내 계획은 다음과 같습니다 :
- 선택 ... 테이블 행을 잠그기 위해 제품의 ... FOR UPDATE.
- 전자 상거래 (Paypal, authorize.net 등)
- 전자 상거래가 성공하면 주문 정보 등을 저장하는 MySQL 저장 프로 시저 (SQL 트랜잭션도 있음)를 호출하십시오. 롤백 실패시
이 계획을 실현할 수 있습니까? SELECT ... FOR UPDATE를 수행하려면 SQL 트랜잭션을 시작해야하지만 MySQL 저장 프로 시저 내에서 3 단계에서 다른 트랜잭션을 시작합니다. 무슨 일이 일어날 지 모르겠습니다. 또한,이 계획은 교착 상태 시나리오로 이어질 것인가?
오랜 질문을 드려 죄송합니다.
''업데이트 선택 '대신'tinyint (1)'처럼 사용할 수있는 항목이 있다고 생각합니다. 항목에 플래그를 지정하는 것이 더 좋은 선택 일 수 있습니다. 'select for update'를 사용하면 교착 상태가 발생할 가능성은 없지만 구매 버튼을 클릭 한 고객 # 2는 (고객 # 1이 잠금을 유지하는 동안) 오랜 시간 동안 기다릴 가능성이 높습니다. 죄송 합니다만, 우리는 재고가 없습니다. " –
필자는 사용 가능한 열에 대해 생각했지만 두 고객이 동시에 "Buy"를 클릭했다고 가정하고 두 요청 모두 "사용 불가능"으로 업데이트되기 전에 열을 "사용 가능"으로 반환하지 않을까요? – user366343
죄송합니다. 분명치 않다면'select for update'를 사용하여 사용 가능한 열을 업데이트한다고 말했어야합니다. 이렇게하면 전체 프로세스를 잠그지 않고 가용성 만 확인하면서 잠글 수 있습니다. 다른 옵션은 사용 가능한 컬럼에 대한 첫 번째 점검 후에 갱신 할 때 update tbl set available = 0 where id = 1 및 available = 1'과 같은 작업을 수행하는 것입니다. 두 사람이 동시에 쿼리를 실행하면 1 번만 성공해야합니다. 그런 다음 업데이트의 영향을받은 행 수를 확인할 수 있습니다. 0 행이 영향을 받으면 부딪 혔습니다. –