Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > PostgreSQL

Respuesta
 
Herramientas Desplegado
Antiguo 16-abr-2008, 17:47   #1 (permalink)
Sergestux no se puede cailificar en este momento
 
Avatar de Sergestux
 
Fecha de Ingreso: agosto-2007
Ubicación: Tijuas
Mensajes: 453
Enviar un mensaje por Yahoo  a Sergestux
Molesto 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
__________________
You'll be free, hackers, you'll be free
Sergestux está desconectado   Responder Citando
Antiguo 17-abr-2008, 01:03   #2 (permalink)
seyko ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.056
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
seyko está desconectado   Responder Citando
Antiguo 17-abr-2008, 11:23   #3 (permalink)
Sergestux no se puede cailificar en este momento
 
Avatar de Sergestux
 
Fecha de Ingreso: agosto-2007
Ubicación: Tijuas
Mensajes: 453
Enviar un mensaje por Yahoo  a Sergestux
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?
__________________
You'll be free, hackers, you'll be free
Sergestux está desconectado   Responder Citando
Antiguo 22-abr-2008, 04:30   #4 (permalink)
seyko ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.056
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
seyko está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 23:47.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93