19-03-2013, 09:40 PM
Il existe, en MySQL, un type de table qui est stocké uniquement en mémoire RAM (MEMORY), si c'est la rapidité (sans sécurité) que tu cherches, regarde ce genre de table. Si besoin, tu peux implémenter ton code de backup pour avoir une copie classique de la table.
Ta solution théorique ne résout pas le problème de concurrence. Imaginons le pseudo-code suivant:
Et là, c'est le drame... Les deux scripts ont chacun voulu enlever 50 points de vie, mais finalement, l'objet est encore vivant.
Pour éviter cela, ce n'est pas "RAM ou HDD?" qu'il faut se poser comme question, mais "Exclusion mutuelle?".
Le seul moyen d'empêcher ce problème de "synchronisation" est de passer par des COMMIT / ROLLBACK, qui "bloquent" les données le temps de faire le traitement. A ce moment là, ok, utiliser la RAM accélèrera le traitement, mais ce n'est pas le fait d'utiliser la RAM qui résoudra le soucis de synchronisation.
La dernière solution peut consister à utiliser des opérations atomiques, et insérer les calculs dans le "UPDATE" de la BDD (dans le cas du retrait de 50 pts de vie, au lieu de "SELECT... puis -50 pts de vie puis UPDATE...", il vaut mieux faire "UPDATE (points_vie-=50)...", qui est une opération atomique.
Ta solution théorique ne résout pas le problème de concurrence. Imaginons le pseudo-code suivant:
Code :
Objet: 100 points de vie
Script1 : Objet : Récupérer les points de vie (100)
Script2 : Objet : Récupérer les points de vie (100)
Script1 : Enlever 50 points de vie
Script2 : Enlever 50 points de vie
Script2 : Sauver le résultat (50 pts de vie)
Script1 : Sauver le résultat (50 pts de vie)
Pour éviter cela, ce n'est pas "RAM ou HDD?" qu'il faut se poser comme question, mais "Exclusion mutuelle?".
Le seul moyen d'empêcher ce problème de "synchronisation" est de passer par des COMMIT / ROLLBACK, qui "bloquent" les données le temps de faire le traitement. A ce moment là, ok, utiliser la RAM accélèrera le traitement, mais ce n'est pas le fait d'utiliser la RAM qui résoudra le soucis de synchronisation.
La dernière solution peut consister à utiliser des opérations atomiques, et insérer les calculs dans le "UPDATE" de la BDD (dans le cas du retrait de 50 pts de vie, au lieu de "SELECT... puis -50 pts de vie puis UPDATE...", il vaut mieux faire "UPDATE (points_vie-=50)...", qui est une opération atomique.