vistas una tablas rendimiento recomendaciones queries porque optimizador lenta las dañan cuello consulta consejos como botella agilizar php mysql transactions pdo acid

php - una - view lenta mysql



¿Cómo funcionan exactamente las transacciones con PHP PDO con concurrencia? (1)

Estoy creando una aplicación web en la que serán múltiples usuarios que interactúan entre sí y leen / toman decisiones sobre / modificando datos compartidos.

He leído que las transacciones son atómicas, que es lo que necesito. Sin embargo, no estoy seguro de cómo funciona con PHP PDO::beginTransaction()

Me refiero a atómico como si una transacción está editando algunos datos, todas las demás transacciones también modifican / leen que los datos deberán esperar hasta que termine la primera transacción. Al igual que no quiero que dos scripts lean un valor, incrementen el anterior y que solo almacenen un incremento. El segundo script debería esperar a que termine el primero.

En casi todos los ejemplos que he visto, las consultas se usan de forma consecutiva ( ejemplos de ejemplos de transacciones PHP + MySQL ). Mucho de lo que estoy haciendo requiere

  • consultar y buscar
  • verificar esos datos y actuar sobre ellos, como parte de la misma transacción
  1. ¿La transacción aún funcionará atómicamente si hay un código PHP entre consultas?
  2. Sé que debes preparar tus declaraciones al margen de la transacción, pero ¿está bien prepararlas por dentro? Básicamente, me preocupa que la actividad de PHP arruine la atomicidad de una transacción.

Aquí hay un ejemplo (este no requiere verificar un valor anterior). Tengo un sistema de bandeja de entrada muy básico que almacena el correo como una matriz serializada (si alguien tiene una mejor recomendación por favor hágamelo saber). Así que lo busqué, anexé el nuevo mensaje y lo almacené. ¿Funcionará como se esperaba?

$getMail = $con->prepare(''SELECT messages FROM inboxes WHERE id=?''); $storeMail = $con->prepare(''UPDATE inboxes SET messages=? WHERE id=?''); $con->beginTransaction(); $getMail->execute(array($recipientID)); $result = $getMail->fetch(); $result = unserialize($result[0]); $result[] = $msg; $storeMail->execute(array(serialize($result), $recipientID)); $con->commit();


Las transacciones son atómicas solo con respecto a otras conexiones de bases de datos que intentan usar los mismos datos, es decir, otras conexiones no verán cambios realizados por su transacción o todos los cambios; "Atomic" significa que ninguna otra conexión de base de datos verá un estado intermedio con algunos datos actualizados y otros no.

El código PHP entre consultas no romperá la atomicidad, y no importa dónde prepare sus declaraciones.