Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Duda con un select dentro de una Transaccion

Estas en el tema de Duda con un select dentro de una Transaccion en el foro de PostgreSQL en Foros del Web. Hola colegas del foro, veran tengo el sig. codigo PHP sin terminar donde tomo una orden (de un restaurant) para esto consulto una tabla de ...
  #1 (permalink)  
Antiguo 16/04/2008, 17:47
Avatar de Sergestux  
Fecha de Ingreso: agosto-2007
Ubicación: Tapachula
Mensajes: 1.218
Antigüedad: 16 años, 8 meses
Puntos: 20
Duda con un select dentro de una Transaccion

Hola colegas del foro, veran tengo el sig. codigo PHP sin terminar donde tomo una orden (de un restaurant) para esto consulto una tabla de control donde se va almacenando el consecutivo de la orden
Código PHP:
            /*Inicio la transaccion*/
            
pg_query$conexion,  'BEGIN;');            //Inicio la Transaccion
            //Localizo el numero de orden siguiente consultando la tabla control y lo almaceno en La variable $NextOrden 
            
$SQL=SELECT control FROM control WHERE tabla='orden';
            
$Res pg_query($conexion,  $SQL);
            
$NextOrden pg_result($Res00);
            
//Inserto la orden
            
$SQL="INSERT INTO orden () VALUES()";                
            
//Actualizo la tabla control        (Update)
            
$SQL="UPDATE control SET control=" . ++$NextOrden;    //La siguente orden                        
            //Marco la mesa correspondiente como ocupada, en la  tabla Mesas    (Update)
            
$SQL="UPDATE mesas SET status=1 WHERE mesaid=" $MesaId;    //Marco la Mesa como Ocupada
            /*Termino la transaccion*/
            
pg_query$conexion,  'COMMIT;');            //Comprometo la Transaccion 
y la duda que me asalta es acerca de si mientras yo consulte el numero consecutivo dentro de una transaccion, no corro el riesgo de tomar un numero equivocado, es decir que otro usuario actualize ese numero antes que yo. Ya que en el sistema seran varios meseros utilizando la aplicacion.

Habia utilizado siempre las transacciones para hacer updates o deletes, pero no para hacer selects si alguien pordria sacarme de la duda estare muy agradecido, en caso contrario tendre que hacer las pruebas
  #2 (permalink)  
Antiguo 17/04/2008, 01:03
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Duda con un select dentro de una Transaccion

Buenas,

Si lo he entendido bien, el numero es un valor de una tabla. Por lo que si puede darse el caso que otro mesero coja el mismo numero. Por que lo haces asi?

Para controlar el problema, puedes utilizar una funcion para que te de el numero, de forma que si alguien lo ha pillado ya lo puedes controlar.
Otra opción que se me ocurre, aunque no me gusta, es bloquear la tabla cuando coges el numero de forma que mientras no la desbloquees nadie más puede coger el numero.

Un saludo
  #3 (permalink)  
Antiguo 17/04/2008, 11:23
Avatar de Sergestux  
Fecha de Ingreso: agosto-2007
Ubicación: Tapachula
Mensajes: 1.218
Antigüedad: 16 años, 8 meses
Puntos: 20
Re: Duda con un select dentro de una Transaccion

Gracias por la respuesta, lo hago así por que es un modulo el que se esta programando y la estructura de la base de datos ya esta, es decir no fui yo quien dispuso esa manera de controlar el numero de orden siguiente.

Eso de la función fue lo primero que pensé, pero ahí si no me quedaría duda sobre la posibilidad de obtener un numero incorrecto (por estar fuera de la transaccion) o tambien la posibilidad de crear otro campo a la tabla control para que me indique si alguien esta usando ese umero consecutivo, por eso hago ese select dentro de la transaccion, basándome en la definición siguiente:
Cita:
BEGIN initiates a transaction block, that is, all statements after a BEGIN command will be executed in a single transaction until an explicit COMMIT or ROLLBACK is given
Por lo cual entiendo que todas las sentencias incluyendo el select se ejecutaran como una misma, creo que mejor tendré que esperarme a que tenga esta parte funcional y hacer las pruebas con dos o mas meseros al mismo tiempo...

Prometo postear los resultados en cuanto los tenga.

P.D.T. No al hacer el Begin (aunque sea un select) ya se esta bloqueando esa tabla o habría que hacerlo de manera explicita?
  #4 (permalink)  
Antiguo 22/04/2008, 04:30
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Duda con un select dentro de una Transaccion

Buenas,

Una funcion siempre se ejecuta dentro de una transacción!

Si dentro de la funcion haces el select y despues haces el update incrementando el valor.
Como todo se ejecuta dentro de la misma transacción, ya tienes controlado el tema de la concurrencia.

Hasta donde se, una select no hace un bloqueo exclusivo de un registro si no se le indica.

No obstante, me has hecho dudas en un par de cosas, cuando tenga un rato hago unas pruebas y te comento.

Un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:45.