2010-05-15 12 views
2

si un INSERT et un SELECT sont effectués simultanément sur une table mysql laquelle ira en premier?MySQL INSERT et SELECT Ordre de préséance

Exemple: Supposons que « utilisateurs » nombre de lignes de table est 0.

Ensuite, ces deux requêtes sont exécutées en même temps (en supposant qu'il est en même Mili/micro seconde):

INSERT into users (id) values (1) 

et

SELECT COUNT(*) from users 

La dernière requête renverra-t-elle 0 ou 1?

Répondre

5

Dépend si votre table users est MyISAM ou InnoDB.

Si c'est MyISAM, une instruction ou l'autre prend un verrou sur la table, et vous ne pouvez pas faire grand-chose pour le contrôler, à moins de locking tables.

S'il s'agit d'InnoDB, il s'agit d'une transaction. L'architecture multi-versionnage permet un accès simultané à la table, et le SELECT verra le nombre de lignes à l'instant où sa transaction a commencé. S'il y a un INSERT qui se passe simultanément, le SELECT verra 0 ligne. En fait, vous pouvez même voir 0 lignes par un SELECT exécuté quelques secondes plus tard, si la transaction pour le INSERT n'a pas encore été validée.

Il n'y a aucun moyen pour les deux transactions de démarrer réellement simultanément. Les transactions sont garanties pour avoir de l'ordre.

2

Cela dépend de l'instruction qui sera exécutée en premier. Si d'abord le second renverra 1, si le second s'exécute en premier, alors il retournera 0. Même si vous les exécutez sur l'ordinateur avec plusieurs cœurs physiques et en raison du mécanisme de verrouillage, ils n'exécuteront jamais exactement au même horodatage