무결성 제약 조건 위반 : 1062 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'키에 대한 중복 항목


13

판매자가 일부 주문 결제 중 실패한 결제 거래의 근본 원인을 추적하도록 돕고 있습니다.

SQLSTATE [23000] : 무결성 제한 조건 위반 : 1062 'UNQ_SALES_FLAT_INVOICE_INCREMENT_ID'키에 대한 중복 항목 '51986'

UNQ_SALES_FLAT_INVOICE_INCREMENT_ID인덱스는에 고유 키입니다 increment_id에서 열 sales_flat_invoice테이블. 이 표 increment_id에서 오류 ( 51986)에 언급 된 내용 을 살펴보면 이미 여기에 송장이 increment_id있는 것으로 나타 났으며 다른 고객이 주문한 것입니다.

이것과 관련된 나의 2 가지 질문

  • Magento CE 1.9.0.1의 송장 ID는 일반적으로 어디에 있습니까?

  • 재고가있는 Magento CE 1.9.0.1에 거의 동시 주문에 대한 송장 ID 충돌과 관련하여 알려진 문제가 있습니까?

증분 ID의 증가 51986는 상점에 설치된 증분 ID를 변경하기위한 일종의 확장 기능이 있음을 알고 있지만 그 경로를 너무 멀리 가기 전에 과학에 대한 과학이 없는지 확인하고 싶습니다.


1
디버그 지점으로 Mage_Eav_Model_Entity_Type :: fetchNewIncrementId () 추가
Alan Storm

1
이전에 이것을 보았지만 누군가 save()가 특정 관찰자 이벤트에 메소드 호출을 배치하여 코드 검토 전 며칠 동안이 문제가 발생할 수 있기 때문입니다.)
Erfan

@AlanStorm, 호기심에서 Eav 엔티티로 들어가는 이유는 인보이스가 플랫 모델이라고 생각합니다.
Prateek

나는 이것이 또한 기본 Magento stackoverflow.com/questions/25918091/…에서
Kristof at Fooman

1
나는 이것을 더 오래 알고 있지만 어떤 이유로 든 eav_entity_store 테이블이 복사되었습니다. 이것은 마지막 주문 ID가 현재 주문한 주문과 일치하지 않는 일반적인 오류입니다. 따라서 Magento는 eav_entity_store 테이블을 사용하여 주문 테이블에 삽입 할 ID를 결정합니다.이 경우 이미 존재합니다. 또한 FooMan 주문 번호 내선 번호에는이 검사를 무시하고이 문제를 파란색으로 표시 할 수 있으므로 매우 일반적인 문제입니다.
Rob

답변:


3

1.6 (?)까지 주문, 송장, 신용 메모, 배송비는 EAV였습니다

@Prateek 인보이스는 EAV 모델이었으며 여전히 incremental_id입니다.

Increment_id 생성 및 문제

여기에 증분 ID가 생성됩니다

\Mage_Eav_Model_Entity_Attribute_Backend_Increment which calls
\Mage_Eav_Model_Entity_Abstract::setNewIncrementId which calls
\Mage_Eav_Model_Entity_Type::fetchNewIncrementId

마지막 방법에서 트랜잭션이 시작되고 테이블 / 행이 잠겨 있지 않기 때문에 2 차 주문 생성이 통과하여 새로 생성 된 것과 동일하게 취할 수 있다고 가정합니다 increment_id.

해결책

읽기 전에 행 / 테이블을 잠그면 새 increment_id를 쓸 때까지 다른 프로세스가 테이블을 읽는 것을 피할 수 있다고 가정합니다. 이것은 도움이 될 수 있습니다 : load ()를 사용한 후 어떻게 행을 잠그나요?

그러나 행을 잠그면 성능이 저하 될 수 있습니다.


1
이 게시물과 @Fabian을 보았습니다. 또한 답변에 누군가가 언급되면 SE는 알림을 트리거해야합니다.
Prateek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.