Aller au contenu

Erreurs aléatoires avec MySQL


John_attend

Sujets conseillés

Bonjour à tous,

A l'ouverture de mon site il y a plusieurs mois je n'avais pas de réels problèmes de bugs, ou alors ceux ci venaient d'une mauvaise programmation du script.

Mais aujourd'hui je suis confronté à des erreurs qui m'embêtent un peu et que je ne sais pas résoudre.

Aujourd'hui mon site génère 1 500 000 pages vues et c'est un site de jeu d'élevage virtuel où chaque page génère plusieurs requêtes : SELECT, UPDATE, INSERT, DELETE, tout y passe, et c'est nécéssere, ce ne sont pas des gadgets comme compteurs de connectés.

Je suis donc confronté à des erreurs qui surviennent aléatoirement et qui ne sont pas dues au script que j'ai vérifié et revérifé. Par exemple, quand quelqu'un achète un objet (c'est un site de jeu), cet objet peut aller sur le compte d'un autre joueur. Mais c'est très infime ! C'est de l'ordre de 0,01 ou 0,001% mais c'est déjà trop...

Question : le fait de faire "beaucoup" d'écritures simultanées dans MySQL peut il altérer l'écriture ?

Si oui, comment corriger ce problème ?

J'espère que vous pourrez apporter une réponse à mes problèmes :-)

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

Sans prétendre apporter une solution...

As tu défini des verrous sur certaines opérations ?

Les verrous dans certains cas peuvent conduire à des enregistrements "fantômes" qui pourraient être la cause de tes soucis.

Par ailleurs MySQL n'était pas connue comme la meilleure des bases de données lorsqu'il existe de très nombreuses transactions simultanées.

La gestion des transactions a été améliorée avec les versions récentes de MySQL, est-ce que tu utilises une version récente?

Si tu as de gros volumes de transactions tu peux envisager de passer à MySQL 5.0 et écrire tes requêtes en procédures stockées - mais MYSQL 5.0 est peut-être encore un peu jeune.

Quitte à utiliser des procédures stockées je me tournerai à ta place vers IBM DB2 Express (gratuite mais il y a des limitations de taille) ou MAXDB (by MySQL).

Des bases de données un peu complexe à prendre en mains, mais le jeu en vaut peut-être la chandelle pour toi.

Sinon tu as toujours PostgresSQL et Firebird (qui comme MAXDB propose un mode Oracle ainsi que les procédures stockées).

Lien vers le commentaire
Partager sur d’autres sites

Non je n'utilise pas de verrous :P

Pour ma version de MySQL, j'utilise une version 3 et des poussieres, j'ai pensé à me tourner vers MySQL 5 et j'ai commencé à me reseigner sur les procédures stockées, ça à l'air intéressant, en espérant que ça puisse résoudre mon problème.

Mais bon, avant de faire quoi que ce soit mieux vaut bien se reseigner car ça implique quand même pas mal de modifications et de boulot.

Changer de base me parait un peu complexe car il faudrait reconvertir tous les enregistrement d'un base à l'autre :huh: (ma base pèse quelques centaines de mo mais ça ne fait que s'agrandir).

En tout cas, merci de ta réponse :)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Les erreurs que tu constate sont certainement dues à des requètes simultanées qui se marchent sur les pieds (ou s'emmèlent les pinceaux, comme tu veux ;) )

Il me semble que la solution consiste à utiliser les transactions, elles "bloquent" une table lorsqu'il y a une mise à jour dessus de façon à ce qu'il n'y ait pas d'erreur possible.

Par contre il me semble que Mysql n'en est pas encore là :( (Postgrsl le fait )

Lien vers le commentaire
Partager sur d’autres sites

Si tu es toujours en version 3.23.x , je te suggère de passer en version 4.0.

Elle est totalement compatible avec la version 3...

Ensuite, un passage à la version 4.1 se fera dans la douceur.

Dan

Lien vers le commentaire
Partager sur d’autres sites

Il me semble que la solution consiste à utiliser les transactions, elles "bloquent" une table lorsqu'il y a une mise à jour dessus de façon à ce qu'il n'y ait pas d'erreur possible.

Par contre il me semble que Mysql n'en est pas encore là :( (Postgrsl le fait )

<{POST_SNAPBACK}>

Mysql gère les transactions depuis longtemps il me semble :).

Lien vers le commentaire
Partager sur d’autres sites

Il me semble que la solution consiste à utiliser les transactions, elles "bloquent" une table lorsqu'il y a une mise à jour dessus de façon à ce qu'il n'y ait pas d'erreur possible.

En effet ce serait une solution mais il est nécessaire pour moi que les écritures s'écrivent simultanément car sinon les visiteurs (joueurs) recontreraient plein d'erreurs régulièrement :nono:

Si tu es toujours en version 3.23.x , je te suggère de passer en version 4.0.

Elle est totalement compatible avec la version 3...

Ensuite, un passage à la version 4.1 se fera dans la douceur.

Le simple fait de passer à une version supérieur (sans modifier l'architecture des scripts ni des tables) peut il à lui seul résoudre ou aténuer le problème ??

Merci à tous de vos réponses :)

Lien vers le commentaire
Partager sur d’autres sites

Mysql4 a des performances supérieures, et peut de ce fait supporter une charge plus élevée.

Sans voir tes scripts, difficile d'être affirmatif, mais on peut supposer que oui.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...