Mysql - erreur de Sérialisation: 1213 Impasse trouvé lorsque vous essayez d'obtenir le verrou; essayez de redémarrer transaction

J'ai menus, categories et products tables. Je suis de l'utilisation de mysql 5.5, Toutes les tables innoDB et dans tous les cas, id est la clé primaire (int) avec autoincrement.

menus table
id, name, status

categories table
id, menu_id, name

products table
id, menu_id, category_id, status, name, url, content

Plusieurs scripts peuvent s'exécuter en parallèle, l'exécution de la même fichier php qui contient la logique suivante.

START TRANSACTION;
SET autocommit = 0;

LOCK TABLES products WRITE, categories WRITE, menus WRITE;

SELECT 
  p.`id`,
  p.`name`,
  p.`url`,
  p.`status`,
  c.`id` cat_id,
  c.`name` cat_name,
  m.`id` `menu_id`,
  m.`name` menu_name
FROM
  products p 
  LEFT JOIN categories c 
    ON p.`subcategory_id` = c.`id` 
  LEFT JOIN menus m 
    ON p.`menu_id` = m.`id` 
   WHERE p.`status` = 0 LIMIT 1

si, après avoir sélectionner résultat est trouvé, c'est le statut est mis à jour à 1 (sinon je la restauration et de libérer les verrous)

UPDATE products SET status = 1 WHERE id = [product_id];

si la dernière requête est réussie j'ai exécuter

COMMIT();
UNLOCK TABLES;

sinon

ROLLBACK();
UNLOCK TABLES;

Après cela, le script est de faire une demande curl pour que les produits' url pour obtenir un peu de contenu et mettre à jour le produit de la ligne en conséquence

// making curl request (might take a few dozen seconds, because proxy is being used and sometimes because of proxy failure the request is attempted again)

trying to update the products table 

    UPDATE products SET content = [received content], status = 2 WHERE id = [product_id]

Le script est donc l'acquisition de verrou X sur le mentionné tables, la récupération d'une ligne de produits de la table qui a le statut de 0 (- FAIRE), en essayant de mettre son statut à 1 (ce qui signifie en ATTENTE), et déverrouille les tables. Après que tente d'exécuter une certaine logique dans le php, et enfin essayer de mettre à jour le tableau des produits - mise à jour de la colonne de contenu et aussi de l'état 2 (FAIT).

Si je cours comme 5 scripts en parallèle, après quelques minutes de course pour la dernière étape (mise à jour du produit à FAIT), j'obtiens cette erreur

Error: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when try to get lock; try restarting transaction

Je comprends l'idée générale de blocages lorsque les 2 opérations sont en attente les uns des autres pour mettre à jour les mêmes lignes dans l'ordre inverse, mais je n'arrive pas à comprendre la raison de l'impasse dans ce cas. Je veux dire que les scripts sont de travail et de verrouillage des tables dans le même ordre, de sorte que si un script a verrouillé le products(et autres), de tables, d'acquérir le verrou exclusif, l'autre scripts doivent attendre dans la file d'attente pour ces verrous pour être libéré, de sorte qu'il ne devrait pas provoquer un blocage.
D'autre part chaque script est la sélection des produits, avec l'état -> 0 et en essayant de mettre à jour à 1, et au cours de la même "session" de 1 à 2, donc je ne vois pas comment cela peut être un motif de blocage. Ce que je suis en manque ici ?

edit:

Si je n'ai pas de mentionner la façon dont je suis en utilisant les catégories et les menus tables d'information", mais j'ai besoin d'extraire ainsi, leur utilisation n'est pas important que je ne le fais pas toute db traitement avec eux.

J'ai l'habitude d'utiliser le verrouillage de ligne SELECT FOR UPDATE, cependant j'ai été faire des blocages comme dans cette question MySQL InnoDB mort de verrouillage sur SÉLECTIONNER avec verrou exclusif (POUR mise à JOUR) , donc, j'ai dû changer le code table de verrouillage au niveau de la

Grâce

OriginalL'auteur dav | 2016-02-03