2011-12-12 9 views
7

Creo que esto es cierto, pero no he encontrado nada en la web para confirmarlo. Puedo obtener la primera identificación generada para el campo de autoincrement usando last_insert_id(), pero ¿puedo suponer que los próximos registros tendrán identificadores secuenciales? ¿O podría otro usuario tomar una identificación para que los ID resultantes no sean secuenciales?¿La inserción de varias hileras de MySQL captura identificadores de autoincremento secuenciales?

Ejemplo: insertar en mytable (asdf, qwer) valores (1,2), (3,4), (5,6), ..., (10000,10001);

Si mytable tiene una columna de autoincremento, y si dos usuarios ejecutan esta instrucción al mismo tiempo, ¿un usuario tomará 10000 ID secuencial y el otro usuario los siguientes 10000 ID secuencial? ¿Qué tal para cientos de usuarios?

Gracias.

+1

Podría ser cierto, pero que no tienen tales garantías por lo que yo sé. – Nanne

Respuesta

9

Depende del motor de almacenamiento utilizado.

  • MyISAM garantiza las filas insertadas tener secuenciales de identificación, ya que un bloqueo de tabla se lleva a cabo durante la inserción.
  • InnoDB: a menos innodb_autoinc_lock_mode se establece en intercalada (2), las filas insertadas tendrán secuenciales de identificación. Por defecto, InnoDB se ejecuta en el modo consecutive desde el modo 5.1 y traditional anterior.

Para más información sobre la opción innodb_autoinc_lock_mode, ver 13.6.4.3. AUTO_INCREMENT Handling in InnoDB

2

Una inserción de varias filas es solo una operación masiva que realiza la misma operación una y otra vez. Cuando se activa una instrucción de inserción, activa un desencadenador que genera la ID.

Así que si el motor de base de datos utilizado, realiza todo su trabajo de forma secuencial (cola como primero en entrar primero en salir) entonces sí, los identificadores secuenciales serán un incremento mayor que el ID anterior; si los datos se insertan en una forma de subprocesos múltiples donde las declaraciones se disparan en paralelo, entonces no, id se dará en "al azar".

No conozco ningún motor mysql que lo garantice, pero de nuevo no he investigado mucho sobre este tema específico.

4

Si usa LOCK TABLES, los lotes deberían obtener identificaciones secuenciales.

Ejemplo:

LOCK TABLES users WRITE; 
<BULK INSERT HERE> 
UNLOCK TABLES; 

Esto evitará múltiples hilos de la escritura a la mesa al mismo tiempo.

+0

¿Puedo usar 'LOCK TABLES ..' para el motor innodb? – stack

+0

Sí - LOCK TABLES funciona con InnoDB - Consulte la documentación de bloqueo: https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html –

Cuestiones relacionadas