Pregunta

Soy bastante nuevo para trabajar con varios subprocesos en una base de datos (la mayor parte de mi carrera se ha dedicado a la interfaz).

Hoy intenté probar una aplicación php simple que escribí para almacenar valores en una base de datos mysql usando tablas ISAM que simulan transacciones mediante el bloqueo de tablas.

Acabo de escribir una entrada de blog sobre el procedimiento Aquí:

Prueba con JMeter

De mis resultados, mi aplicación php simple parece mantener intacta la integridad transaccional (como se ve en los datos de mis archivos csv que son los mismos que los datos que re-extraje de la base de datos):

Archivos CSV:

alt csv for al  alt csv para bl

Consulta de datos para ambos usuarios después de la ejecución de la prueba JMeter:

alt  alt

¿Estoy en lo cierto al suponer que la integridad de los datos transaccionales está intacta?

¿Cómo se prueba la concurrencia?

¿Fue útil?

Solución

¿Por qué no usar InnoDB y obtener el mismo efecto sin los bloqueos de tabla manuales?

Además, ¿contra qué estás protegiendo? Considere dos usuarios (Bill y Steve):

  1. Bill carga el registro 1234
  2. Steve carga el registro 1234
  3. Steve cambia el registro 1234 y envía
  4. Bill espera un poco, luego actualiza el registro obsoleto 1234 y lo envía. Estos cambios golpean a Bill.

El bloqueo de tabla no ofrece una integridad de datos mayor que el bloqueo de tabla MyISAM nativo. MyISAM bloqueará de forma nativa los archivos de la tabla cuando sea necesario para detener la corrupción de datos.

De hecho, la razón para usar InnoDB sobre MyISAM es que hará el bloqueo de filas en lugar del bloqueo de tablas. También soporta transacciones. Las actualizaciones múltiples en registros diferentes no se bloquearán entre sí y las actualizaciones complejas en registros múltiples se bloquearán hasta que se complete la transacción.

Debe considerar la posibilidad de que se realicen dos actualizaciones al mismo registro al mismo tiempo para su aplicación. Si es probable, el bloqueo de tabla / fila no bloquea la segunda actualización, solo la pospone hasta que se complete la primera actualización.

EDIT

Por lo que recuerdo, MyISAM tiene un comportamiento especial para las inserciones. No es necesario bloquear la tabla en absoluto para una inserción, ya que solo se está agregando al final de la tabla. Es posible que esto no sea así para las tablas con índices únicos o claves primarias que no sean de autoincremento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top