w3schools vaciar tabla que hace foreign ejemplo como comando mysql transactions truncate

vaciar - truncate table mysql w3schools



MySQL: ¿Truncar tabla dentro de transacción? (3)

De su descripción no puedo explicar su diferencia de tiempo. Lo único que viene a la mente es que en realidad no envuelve las inserciones en una transacción, sino que las enrolla.

La diferencia clave con SET AUTOCOMMIT = 0 es que si ya es 0, no hará nada, ya que al igual que con START TRANSACTION, iniciará una sub-transacción dentro de la transacción actual.

Tengo una tabla de InnoDB que debe volver a completarse cada diez minutos en cualquier lugar de 60k a 200k registros. Nuestro enfoque hasta este punto ha sido el siguiente:

  1. Desactivar la confirmación automática
  2. Truncar la mesa
  3. Realizar consultas selectas y cálculos adicionales (usando PHP)
  4. Insertar nuevos registros
  5. Cometer

Sin embargo, después de que se realiza la operación Truncar, los datos se eliminan de inmediato y ya no están disponibles en la interfaz de usuario. Para nuestros usuarios, esto ha sido bastante desconcertante, aunque en unos 30 segundos aproximadamente, el script encuentra la operación Commit y la tabla se vuelve a llenar.

Pensé que tal vez podría envolver toda la operación, incluida la función Truncar, en una transacción, y que esto podría reducir el tiempo durante el cual la tabla aparece vacía para los usuarios. Así que cambié "SET AUTOCOMMIT = 0" a "START TRANSCATION".

¡Ay! Esto tuvo el efecto contrario al deseado! Ahora, la operación TRUNCATE todavía se produce al comienzo del script, pero lleva MUCHO más tiempo para ejecutar realmente las operaciones INSERT dentro de la transacción, de modo que para el momento en que se realice la operación COMMIT y los datos de la tabla vuelvan a estar disponibles. Han pasado casi diez minutos!

¿Qué podría causar esto? Sinceramente, no esperaba ningún cambio en absoluto, porque tenía la impresión de que, al iniciar una transacción, básicamente, ¿se desactiva automáticamente la admisión automática?


Una mejor manera de lograr esto podría ser insertar los datos en una nueva tabla, y luego usar rename en ambas tablas para intercambiarlas. Un solo cambio de nombre es todo lo que se necesita para el intercambio, y esto es una acción atómica, lo que significa que los usuarios ni siquiera podrán detectar que sucedió, a excepción de los nuevos datos que aparecen. A continuación, puede truncar / eliminar los datos antiguos.


http://dev.mysql.com/doc/refman/5.1/en/truncate-table.html

Según esta URL, a partir de MySQL 5.1.32, TRUNCATE TABLE es DDL y NO DML como DELETE. Esto significa que TRUNCATE TABLE causará un COMMIT implícito en medio de un bloque de transacción. Por lo tanto, use DELETE FROM en una tabla que necesita vaciar en lugar de TRUNCATE TABLE .

Incluso DELETE FROM tblname; puede ser revertido La reversión puede demorar un tiempo, así que asegúrese de que InnoDB esté correctamente sintonizado para manejar el tiempo de transacción para tales posibilidades de reversión.