The MYSQL error is more a symptom of another issue, than the cause.
In your question you mention that you get a 'long page load' -> this is the real reason for your issues, and then results in the MYSQL has gone away
error.
What you need to diagnose is that long delay. What is causing it?
It can be a multitude of things.
As an example, on a site I manage, I had exactly the same issues. The end result was that a 3rd party module was syncing orders with an external system using the sales_order_place_after
method, which then resulted in a long delay, and the MYSQL error.
You need to debug what that delay is, and solve the root of the issue.
Another example could be when customers sign up for newsletter at checkout (hence why only some are affected) - if you are using an external newsletter signup system, that signup sync could cause delays in the checkout, if not properly implemented.
Your best way to solve this, and identify the lag is to use NewRelic.
ref:
https://github.com/ProxiBlue/OrderSyncQueRunner
http://www.proxiblue.com.au/blog/new-relic/
Anssi,Magento shipment depends on canShip function of Order.php(Mage_Sales_Model_Order)
public function canShip()
{
if ($this->canUnhold() || $this->isPaymentReview()) {
return false;
}
if ($this->getIsVirtual() || $this->isCanceled()) {
return false;
}
if ($this->getActionFlag(self::ACTION_FLAG_SHIP) === false) {
return false;
}
foreach ($this->getAllItems() as $item) {
if ($item->getQtyToShip()>0 && !$item->getIsVirtual()
&& !$item->getLockedDoShip())
{
return true;
}
}
return false;
}
Explanation:
Condition1: if ($this->canUnhold() || $this->isPaymentReview())
means if Order state code is unhold or order state code is payment_review
you cannot create shipment.
Condition2: if ($this->isCanceled() || $this->getIsVirtual() )
{
If order state is cancel or order is virtual
means ,you have buy a virtual product,you can not do a shipment
Condition 3:
if ($this->getActionFlag(self::ACTION_FLAG_SHIP) === false) {
If current action is ship then you can create Shipment
Condition4:
if($item->getQtyToShip()>0 && !$item->getIsVirtual()
&& !$item->getLockedDoShip())
if order all item qty_to_ship value is greater than 0 and Order is not virtual and all items column locked_do_ship is null (
In sales_flat_order_item table)
Best Answer
Tested in Magento 2.1.0
Be safe : make a backup of your sql first.
Use the sql below according to your needs :
DO NOT TRUNCATE / EMPTY THE FOLLOWING :
Thank you