2009-12-22 7 views
0

Si j'ai une opération comme suit:Table MySql verrouillage

Dans l'opération ci-dessus sera verrouillé la table foo jusqu'à ce que tous les inserts dans la barre sont faites? Aussi, pendant que les inserts sont en cours, la barre de la table sera-t-elle verrouillée, comme dans, est-ce que personne ne pourra lire la barre (pas dérangé par les inserts)?

Supposons que la base de données utilise le niveau d'isolation REPEATABLE READ et que le moteur de stockage soit InnoDB.

+0

Avez-vous vérifié que la table est InnoDB et non MyISAM? MyISAM ne prend pas en charge les transactions. – Yada

+0

Désolé, j'ai oublié de mentionner cela. C'est InnoDB. – Abhi

Répondre

0

Non, une opération InnoDB comme ça ne se verrouille pas les tables (Assuming niveau d'isolation par défaut tx).

Normalement, il n'y a pas du tout de verrous de table, mais il y a quelques types de verrous qui peuvent ressembler à ça. Avec le niveau d'isolement par défaut dans innodb, les lecteurs ne bloquent jamais les écrivains et les rédacteurs ne bloquent jamais les lecteurs. C'est par conception. Et si vous faites un INSERT ... SELECT, ce serait plus efficace, mais probablement pas différent en termes de verrouillage.

Il y a le mutex InnoDB auto-inc que vous voudrez peut-être lire (recherchez les docs pour plus d'informations), mais ce n'est pas un verrou de table.

0

Dans un niveau de sérialisation REPEATABLE READ, les données sélectionnées de foo sont verrouillées (mais vous pouvez toujours ajouter à foo ou modifier des lignes qui n'ont pas été sélectionnées). Si vous insérez seulement dans bar, je ne crois pas que des verrous se produiraient sur les lignes existantes dans la table.

Également, avez-vous une raison de ne pas utiliser un insert-select?

insert into bar (...) select ... from foo;