2010-05-07 6 views
2

Je réalise des insertions plus grandes composées de quelques milliers de lignes dans mon application web actuelle et je voudrais m'assurer que personne ne puisse faire autre chose que lire la table, jusqu'à ce que les insertions aient été faites. Quelle est la meilleure façon de faire cela tout en gardant la disponibilité de lecture ouverte pour les utilisateurs non-administrateurs normaux?Verrouiller la table innoDB temporairement

Merci! Pourquoi ne pas simplement faire l'insertion dans une grande transaction?

Répondre

2

Vous devrez peut-être modifier le niveau d'isolement par défaut:

set transaction isolation level serializable; 
start transaction; 
// insert data 
commit 
+0

Salut A1ex07. Merci beaucoup. Est-ce une solution temporaire qui doit être appelée sur chaque requête (ce qui serait génial) ou est-elle permanente? Merci! – Industrial

+0

Cela dépend de la logique métier de votre application. Le niveau d'isolation sérialisable garantit qu'aucune autre transaction ne peut modifier les données susceptibles d'affecter la transaction en cours. Par exemple, après l'exécution de SELECT count (*) FROM table1 WHERE field1 <10, les autres transactions ne peuvent pas insérer/supprimer/mettre à jour les enregistrements de table1 si elle modifie le résultat de la requête. Donc, si vos INSERTS ne doivent pas être exécutés dans un ordre particulier et que chaque requête suivante ne dépend pas de la précédente, vous pouvez exécuter chaque requête dans une transaction séparée ... – a1ex07

1

Cela empêcherait en quelque sorte le verrouillage.

2

Puisque vous insérez seulement (pas de mise à jour) cela ne devrait pas poser de problème. Il suffit d'insérer les enregistrements dans une seule transaction. InnoDB prend en charge le verrouillage de niveau ligne si je me souviens bien, donc même les mises à jour ne devraient pas poser de problème.

Questions connexes