Ver Mensaje Individual
  #1 (permalink)  
Antiguo 04/10/2014, 11:18
asardon
 
Fecha de Ingreso: octubre-2014
Ubicación: Bilbao
Mensajes: 14
Antigüedad: 9 años, 7 meses
Puntos: 0
bloque de registro desde php

Hola:

Soy nuevo en el foro y me estoy iniciando en el mundo de la programación con php. Y me encuentro atascado en un problema que es recurrente en los foros de internet y que sin embargo no parece que haya una solución eficaz. Quiero hacer lo siguiente:

1. Hacer una select a la base de datos y recuperar un registro de una tabla.
2. Rellenar un formulario de edición con los datos extraídos de la BD.
3. Permitir que el usuario modifique los campos del formulario y enviar los datos modificados, con lo cual el "action" del formulario llamará a un php que se encargará de
4. Recoger los datos modificados en el formulario y guardarlos de nuevo en la BD.

Parece simple. El problema está en la concurrencia en el acceso a la base de datos. Es decir ¿qué pasa si entre el paso 1 y el paso 4 se introduce otro usuario, recupera ese mismo registro y lo elimina, o lo modifica antes de que acabe el otro usuario?

Cuando el primer usuario intente hacer un UPDATE del registro le dará un error porque ese registro ya no existe, o si ha sido modificado por el segundo usuario, el primero se cargará los cambios del segundo.

El gestor de base de datos es MySQL. MySQL tiene recursos para gestionar estas situaciones, en concreto las transacciones. Pero hay un problema desde php: que no se puede mantener una conexión única a la base de datos en todo el proceso descrito, desde el paso 1 al paso 4, y en consecuencia tampoco se puede mantener una transacción.

La soluciones que implementan semáforos, aparte de ser intrusivas, no son eficaces porque los semáforos también son afectados por la concurrencia y, además, si el usuario no concluye un proceso de edición los semáforos se quedan bloqueados.

Y la pregunta del millón es ¿cómo resuelven los programadores php experimentados este problema?

Gracias por la atención y un saludo.

--
Agustín Sardón