J'ai une table innoDB qui enregistre les utilisateurs en ligne. Elle est mise à jour à chaque rafraîchissement de page par un utilisateur pour garder la trace des pages sur lesquelles il se trouve et de sa dernière date d'accès au site. J'ai ensuite un cron qui s'exécute toutes les 15 minutes pour SUPPRIMER les anciens enregistrements.
La nuit dernière, j'ai eu un message d'erreur "Deadlock found when trying to get lock ; try restarting transaction" pendant environ 5 minutes. Il semble que ce soit lors de l'exécution d'INSERTS dans cette table. Quelqu'un peut-il me suggérer comment éviter cette erreur ?
\=== EDIT ===
Voici les requêtes en cours d'exécution :
Première visite sur le site :
INSERT INTO onlineusers SET
ip = 123.456.789.123,
datetime = now(),
userid = 321,
page = '/thispage',
area = 'thisarea',
type = 3
A chaque rafraîchissement de page :
UPDATE onlineusers SET
ips = 123.456.789.123,
datetime = now(),
userid = 321,
page = '/thispage',
area = 'thisarea',
type = 3
WHERE id = 888
Cron toutes les 15 minutes :
DELETE FROM onlineusers WHERE datetime <= now() - INTERVAL 900 SECOND
Il effectue ensuite quelques comptages pour enregistrer certaines statistiques (par exemple : membres en ligne, visiteurs en ligne).
0 votes
Pouvez-vous fournir plus de détails sur la structure de la table ? Y a-t-il des index groupés ou non groupés ?
15 votes
dev.mysql.com/doc/refman/5.1/fr/innodb-deadlocks.html - L'exécution de "show engine innodb status" fournirait des diagnostics utiles.
0 votes
Comment l'insertion d'une seule ligne peut-elle entraîner un blocage pour cette insertion ? Je m'attendais à ce que, dans une transaction, il faille tenter d'acquérir au moins deux verrous pour provoquer un blocage. L'insertion d'une seule ligne ne détient qu'un seul verrou. Je pense qu'il vous manque des insertions ou des sélections dans votre première requête.