제품 가격 재색 인화 프로세스로 인해 체크 아웃 프로세스에서 교착 상태 예외가 발생한다고 생각되는 문제가 발생했습니다.
결제 과정 에서이 예외가 발생했습니다.
주문 변환 예외 : SQLSTATE [40001] : 직렬화 실패 : 1213 잠금을 시도 할 때 교착 상태가 발견되었습니다. 거래를 다시 시작하십시오
불행히도 예외가 포착 된 위치 때문에 전체 스택 추적이 없지만 INNODB 상태를 확인하면 교착 상태를 추적 할 수있었습니다.
SELECT `si`.*, `p`.`type_id` FROM `cataloginventory_stock_item` AS `si`
INNER JOIN `catalog_product_entity` AS `p` ON p.entity_id=si.product_id
WHERE (stock_id=1)
AND (product_id IN(47447, 56678)) FOR UPDATE
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 329624 n bits 352 index
`PRIMARY` of table `xxxx`.`catalog_product_entity`
SQL 요청 테이블 잠금은 Mage_CatalogInventory_Model_Stock::registerProductsSale()
감소시키기 위해 현재 인벤토리 수를 가져 오려고 할 때 생성됩니다 .
교착 상태가 발생했을 때 제품 가격 재색 인 프로세스가 실행 중이며 catalog_product_entity table
교착 상태를 유발 한 읽기 잠금이 있다고 가정합니다 . 교착 상태를 올바르게 이해하면 읽기 잠금으로 인해 교착 상태가 발생하지만 사이트에 ~ 50,000 개의 제품이 있으므로 제품 가격 재 색인이 일정 시간 동안 잠금을 유지합니다.
불행히도, 결제 코드 흐름의이 시점까지 고객의 신용 카드에 요금이 청구되었으며 (맞춤 결제 모듈을 통해) 해당 주문 객체를 생성하지 못했습니다.
내 질문은 :
- 맞춤 결제 모듈 로직에 결함이 있습니까? 즉, 결제 수단 (신용 카드)으로 청구하기 전에 Magento가 견적을 주문 예외로 무료로 변환 할 수 있도록 허용 된 흐름이 있습니까?
편집 : 지불 모듈 논리는 실제로이 교착 상태가 발생한 장소 이후에 (이반의 대답에 따라) $ paymentmethod-> authorize ()에 대한 호출이 발생하기 때문에 실제로 잘못되었습니다. 그러나 거래는 여전히 교착 상태에 의해 차단됩니다 (신용 카드에 오류가없는 경우에도).
이 함수 호출
$stockInfo = $this->_getResource()->getProductsStock($this, array_keys($qtys), true);
은Mage_CatalogInventory_Model_Stock::registerProductsSale()
잠금을 읽습니다. 잠금이 아닌 읽기로 만드는 것이 얼마나 위험합니까?웹에서 답변을 검색 할 때 사이트가 뜨거울 때 두 곳에서 전체 재 인덱싱을 실행하지 말 것을 제안했습니다. 좋은 해결책처럼 보이지는 않습니다. 인덱싱 문제로 인해 테이블 교착 상태 및 잠금 경합이 Magento에서 알려진 문제입니까? 해결 방법이 있습니까?
편집 : 여기에 남아있는 질문은 세 번째 질문의 것 같습니다. 다시 색인화하면 테이블 교착 상태가 발생합니다. 이에 대한 해결 방법을 찾고 있습니다.
편집 : 교착 상태는 그 자체로 문제가 아니라 그에 대한 응답이 초점이되어야한다는 개념은 많은 의미가 있습니다. 교착 상태 예외를 포착하고 요청을 다시 발행하기 위해 코드에서 포인트를 찾기 위해 추가로 조사합니다. Zend Framework DB 어댑터 수준에서이 작업을 수행하는 것이 한 가지 방법이지만 유지 관리를 쉽게하기 위해 Magento 코드에서이 작업을 수행하는 방법도 찾고 있습니다.
이 스레드에는 흥미로운 교착 상태가 있습니다 . http://www.magentocommerce.com/boards/viewthread/31666/P0/ 관련 교착 상태를 해결하는 것으로 보입니다 (단, 구체적으로는 아님).
편집 : 분명히 교착 상태는 CE 1.8 Alpha에서 어느 정도 해결되었습니다. 이 버전이 알파 버전이 될 때까지 해결 방법을 찾고 있습니다.