[MySQL] Verrous tables MyISAM / InnoDB

Verrous tables MyISAM / InnoDB [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 27-02-2006 à 05:39:20    

Bonjour, quelques petites questions de fond :). Je suis assez ignorant sur les verouillages de table.
 
1) Une application peut-elle se passer d'utiliser des verrous dans la plupart des cas, ou est-ce à votre avis indispensable ? Quels sont les risques si on n'utilise pas de verrous sur les tables dans son application ? Quels sont les avantages ?
 
2) Si on décide d'utiliser des verrous sur des tables MyISAM, on doit lock une table dès qu'on veut la modifier ? Aussi quand on veut la lire ?
 
3) Si on utilise des tables InnoDB, quasiment tout est geré automatiquement non ? On gère la transaction, pas les lock non ?


Message édité par Djebel1 le 27-02-2006 à 05:45:10
Reply

Marsh Posté le 27-02-2006 à 05:39:20   

Reply

Marsh Posté le 27-02-2006 à 09:25:20    

InnoDB gère les transactions, oui.

Reply

Marsh Posté le 27-02-2006 à 19:02:13    

euh oui, merci, mais c'est pas du tout la question :)

Reply

Marsh Posté le 28-02-2006 à 11:12:21    

Djebel1 a écrit :

euh oui, merci, mais c'est pas du tout la question :)


 
je répondais à la 3) où il m'avait semblé déceler une demande de confirmation. Désolé.

Reply

Marsh Posté le 01-03-2006 à 01:21:54    

et pour la 3), pas besoin de gérer les verrous avec les transactions donc ?

Reply

Marsh Posté le 01-03-2006 à 11:31:47    

Djebel1 a écrit :

et pour la 3), pas besoin de gérer les verrous avec les transactions donc ?


 
Il ne me semble pas puisqu'avec les transactions, tout ce fait en ram avant le commit. Donc, on travaille sur une copie de la table que l'on est en train de modifier (ou du moins, lune copie de l'enregistrement), je pense.

Reply

Marsh Posté le 01-03-2006 à 21:35:50    

Mais corrige moi si je me trompe, les tables transactionnelles, ça demande quand même un peu plus de maintenance non ? pour gérer les fichiers de log, et tout ça et tout ça.
Si tu dois développer pour des mecs qui veulent avoir le minimum à gérer derrière, vaut mieux rester en MyISAM ?
 
Enfin d'une manière générale, dans quels cas vaut il mieux choisir des tables transactionnelles ou non ?

Reply

Marsh Posté le 02-03-2006 à 10:47:48    

non, je pense pas que ça change grand chose côté maintenance. En MyIsam, le commit() est fait automatiquement te y'a pas de rollback possible (ou alors, faut que tu te le gères toi même avec tes fonctions à toi). En InnoDB, tu fais le commit au moment qui te parraît opportun te tu peux faire du rollback (dans le cas où une erreur survient à un moment donné dans le processus de MAJ d'une ou plusieurs tables).

Reply

Marsh Posté le 02-03-2006 à 17:27:06    

S'il n'y a pas de différence au niveau de la maintenance et / ou de la place necessaire, a quoi sert le type MyIsam ? :p Parce que dans ce cas, il n'a aucun interet.

Reply

Marsh Posté le 02-03-2006 à 18:26:05    

Ben c'est le format par défaut de mysql, et il était là le premier... Donc, dans un souci de compatibilité, ils l'ont gardé. Et puis, pas la peine de sortir de rouleau compresseur quand la tapette à mouche suffit :D

Reply

Marsh Posté le 02-03-2006 à 18:26:05   

Reply

Marsh Posté le 02-03-2006 à 19:04:40    

ok merci bcp pour tes réponses.
 
En fait, quand j'avais regardé, la configuration de la taille et l'emplacement du fichier de log m'avait paru plus compliqué (changer l'emplacement du fichier de log quand il est trop gros, etc). En même temps j'ai jamais regardé comment faire la config pour une table MyIsam :p
 
Et donc avec les tables transactionnelles, tu peux sans souci restaurer ta base telle qu'elle était à un instant t ? donc pas besoin de stocker les actions effectuées dans la base elle-même ?

Reply

Marsh Posté le 03-03-2006 à 11:45:40    

Attention, tu peux restaurer les tables sur lesquelles tu n'as pas fait de commit() dans l'état où elles se trouvaient avant que tu fasses les modifs. mais ça ne garde pas tous les états successifs des tables au cours du temps (t'imagines, sinon, la taille qu'il faudrait quand on travaille sur une grosse BD???)...

Reply

Marsh Posté le 03-03-2006 à 19:35:56    

bah moi c'est bien ce que j'avais compris en fait. Qu'en cas de corruption de la base, tu pouvais refaire toutes les opérations qui avaient eu lieu depuis la dernière sauvegarde de la base :x

Reply

Marsh Posté le 06-03-2006 à 09:46:43    

là, ça ne concerne plus les transactions mais la politique de sauvegarde. Pour la corruption de la BD, à part un pb de HDD, je vois pas (à moins qu'un code source foireux corrompt les données)...

Reply

Marsh Posté le 06-03-2006 à 16:53:55    

oui je parlais d'un vilain vilain crash serveur ;)
 J'avais cru lire qu'avec les tables transactionnelles tu pouvais refaire toutes les opérations qui avaient eu lieu depuis la dernière sauvegarde de la base (ouais je radote).
 
Et donc tu me dis que c'est faux ?

Reply

Marsh Posté le 07-03-2006 à 14:45:57    

ben oui, c'est faux. En +, si ton disque il crash, où vas-tu récupérer les infos pour "rejouer" les opérations qui ont eu lieu depuis la dernière sauvegarde. Les transactions se font en RAM. Si ton disque crash, faut le changer. Tu dois donc arrêter ton PC pour effectuer le changement de disque : tu perds donc ce qui est en RAM. CQFD :D

Reply

Marsh Posté le 08-03-2006 à 01:22:47    

ouais c'est sur :x
mais alors, là (par exemple) : http://www.manuelphp.com/mysql/innodb-overview.php
 
ils veulent dire quoi par

Citation :

capacités de restauration après crash


 
et par rapport aux verrous :

Citation :

InnoDB utilise un verrouillage de lignes


donc les lignes utilisées restent verouillées tant que tu n'as pas fini ta transaction ?

Reply

Marsh Posté le 08-03-2006 à 09:23:52    

"Capacité de restauration après crash"... de la base de données, pas du HDD. En lisant ce paragraphe, on comprend mieux de quoi il en retourne : http://www.manuelphp.com/mysql/implementation.php
La restauration est possible grâce aux fichiers de logs qui tracent les insert/update/delete. Donc, en repartant d'une base de données VALIDE (et précédemment sauvegardée), on peut restaurer jusqu'à un certain point. Comme précisé, si on fait pas de purge de temps en temps de ces ficheirs de logs, ils vont grossir énormément...
 
"InnoDB utilise un verrouillage de lignes" -> je pense que oui, les lignes restent verrouillées tant que les transactions sont pas finies, mais comme j'ai compris, il est possible d'effectuer plusieurs verrouillages sur les mêmes lignes, c'est ce qu'ils appellent le multi-versionning.

Reply

Marsh Posté le 08-03-2006 à 17:14:21    

oui alors au temps pour moi, depuis le début je parlais de restauration après crash de la base. Donc finalement j'en reviens à mes premières questions :

Citation :

Et donc avec les tables transactionnelles, tu peux sans souci restaurer ta base telle qu'elle était à un instant t ? (dans la limite des fichiers de log) donc pas besoin de stocker les actions effectuées dans la base elle-même ?


 
et

Citation :

les tables transactionnelles, ça demande quand même un peu plus de maintenance non ? pour gérer les fichiers de log, et tout ça et tout ça.


Puisque donc il faut s'occuper de purger les fichiers de log, ça demande bien un peu plus de maintenance non ? Si tu ne fais pas cette maintenance, ça risque de poser probleme j'imagine ?

Reply

Marsh Posté le 09-03-2006 à 10:30:49    

les fichiers de logs son normalement purgés automatiquement puisque les transactions complètement terminées sont supprimées (c'est ce que j'ai compris de la doc).
Au fait, c'est pour gérer quoi ta BD?

Reply

Marsh Posté le 10-03-2006 à 16:22:26    

bah là j'ai 2 projets :
- une pour stocker des données biologiques, les informations d'obtention, et les informations relatives (gène, sonde, etc) (un énorme gros bordel)
- une autre relativement simple pour stocker les informations d'un jeu (créatures rencontrées, objets qu'ils laissent etc)
 
Et en fait, je me disais que plutôt que devoir se faire chier à utiliser des verrous, utiliser des transactions qui gêrent les verrous toutes seules ça pouvait le faire ^^

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed