Tôi đang gặp vấn đề khi tôi tin rằng quy trình lập chỉ mục lại Giá sản phẩm đang gây ra ngoại lệ bế tắc trong quy trình thanh toán.
Tôi đã bắt gặp ngoại lệ này trong quá trình thanh toán:
Ngoại lệ chuyển đổi đơn hàng: SQLSTATE [40001]: Lỗi nối tiếp: 1213 Bế tắc được tìm thấy khi cố gắng khóa; thử khởi động lại giao dịch
Thật không may, tôi không có dấu vết ngăn xếp đầy đủ vì nơi bắt gặp ngoại lệ, nhưng kiểm tra trạng thái INNODB tôi có thể theo dõi bế tắc:
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`
Khóa bảng yêu cầu SQL cuối cùng được tạo từ Mage_CatalogInventory_Model_Stock::registerProductsSale()
khi nó đang cố lấy số lượng hàng tồn kho hiện tại để giảm giá trị.
Vào thời điểm bế tắc xảy ra, quá trình lập chỉ mục lại Giá sản phẩm đang chạy và tôi cho rằng nó có khóa đọc trên catalog_product_entity table
đó gây ra bế tắc. Nếu tôi hiểu chính xác về bế tắc thì bất kỳ khóa đọc nào cũng sẽ gây ra bế tắc, nhưng chỉ số lại giá sản phẩm giữ khóa trong một thời gian hợp lý vì trang web có ~ 50.000 sản phẩm.
Thật không may, tại thời điểm này trong dòng mã thanh toán, thẻ tín dụng của khách hàng đã bị tính phí (thông qua mô-đun thanh toán tùy chỉnh) và việc tạo đối tượng đặt hàng tương ứng không thành công.
Câu hỏi của tôi là:
- Là mô-đun thanh toán tùy chỉnh logic bị lỗi? tức là có một luồng được chấp nhận để đảm bảo rằng Magento có thể chuyển đổi báo giá thành ngoại lệ đơn hàng miễn phí trước khi thực hiện tính phí cho phương thức thanh toán (thẻ tín dụng) không?
Chỉnh sửa: Dường như logic mô-đun thanh toán thực sự bị lỗi vì lệnh gọi $ Paymentmethod-> ủy quyền () sẽ xảy ra sau khi xảy ra bế tắc này, không phải trước đó (theo câu trả lời của Ivan bên dưới). Tuy nhiên, giao dịch vẫn sẽ bị chặn bởi bế tắc (mặc dù không có phí sai cho thẻ tín dụng).
Gọi hàm này
$stockInfo = $this->_getResource()->getProductsStock($this, array_keys($qtys), true);
trongMage_CatalogInventory_Model_Stock::registerProductsSale()
làm cho nó một khóa đọc, làm thế nào nguy hiểm nó sẽ là để làm cho nó một tổ chức phi khóa đọc?Khi tìm kiếm câu trả lời trên web, một vài nơi đề nghị không chạy lại chỉ mục đầy đủ trong khi trang web đang nóng; hầu như không phải là một giải pháp tốt; là vấn đề lập chỉ mục gây ra bế tắc bảng và tranh chấp khóa là một vấn đề đã biết trong Magento, có cách giải quyết nào không?
Chỉnh sửa: Có vẻ như câu hỏi còn lại ở đây là câu hỏi từ câu hỏi thứ ba; lập chỉ mục lại gây ra bế tắc bảng. Tìm kiếm cách giải quyết cho việc này.
Chỉnh sửa: Khái niệm bế tắc không phải là vấn đề của chính họ, mà là phản ứng với chúng nên là trọng tâm, rất có ý nghĩa. Điều tra thêm để tìm một điểm trong mã để bắt ngoại lệ bế tắc và phát hành lại yêu cầu. Làm điều này ở cấp bộ điều hợp Zend Framework DB là một cách tiếp cận, nhưng tôi cũng đang tìm cách để làm điều này trong mã Magento để dễ bảo trì.
Có một bản vá thú vị trong chủ đề này: http : //www.magentoc Commerce.com/boards/viewthread/31666/P0/ dường như để giải quyết một điều kiện bế tắc liên quan (nhưng không phải là điều này cụ thể).
Chỉnh sửa: Rõ ràng bế tắc đã được giải quyết ở một mức độ trong CE 1.8 Alpha. Vẫn đang tìm cách giải quyết cho đến khi phiên bản này không còn Alpha