Vfp y Firebird bloquear Registros

328 views
Skip to first unread message

Antonio Meza

unread,
Jan 11, 2012, 5:32:15 PM1/11/12
to publice...@googlegroups.com
Buena tarde a todos!!

Recomiendan usar un SELECT agregando WITH LOCK para bloquear uno o varios registros según sea el caso, la idea es tener una tabla con varios registros con los nombres de las tablas para obtener los diferentes consecutivos algo parecido a un tema en portalfox por Luis Maria pero que aplica en tablas nativas de VFP y bloquear solo el registro de la tabla que deseo obtener el consecutivo. como el alta de registros es muy esporádico croe que no causaría muchos problemas de bloqueo si otro usuario intenta hacer lo mismo, es decir el tiempo seria muy corto. pero no se si es lo optimo o hay otra forma?

El codigo es el siguiente:

WAIT windows SQLEXEC(myConexion,"SET TRANSACTION") && inicio la transaccion
WAIT windows SQLEXEC(myConexion ,"select * from IdTablas where tabla = 'USUARIOS' with lock","IdTablas") && Bloqueo el registro
IF RECCOUNT() = 0
* Agregar Registro si no existe
sqltxt = "insert into idtablas (tabla,idtabla) values ('USUARIOS',1)"
WAIT windows SQLEXEC(myConexion ,sqltxt)
ELSE
WAIT windows SQLEXEC(myConexion,"update IdTablas set idtabla = idtabla + 1") && Incremento
ENDIF
WAIT windows SQLEXEC(thisform.oampfb,"COMMIT") && cierro la transaccion grabando

NOTA: le pongo WAIT windows para saber si esta ejecutando bien las instrucciones sql, 

saludos
Antonio Meza

Walter R. Ojeda Valiente

unread,
Jan 11, 2012, 7:02:41 PM1/11/12
to publice...@googlegroups.com
NO.

Jamás uses "WITH LOCK".

Es una posibilidad que te da el Firebird pero es una práctica malísima el usarlo en el 99.9999999999999999999% de los casos. Y en los restantes no es malísima, es simplemente mala práctica.

La arquitectura MGA te permite escribir y leer datos sin interferir con los otros lectores y escritores, eso es algo fantástico, no lo desperdicies utilizando WITH LOCK.

Si quieres obtener el valor actual de un generador puedes escribir:

SELECT
  GEN_ID(NombreDeMiGenerador, 0)
FROM
   RDB$DATABASE

Saludos.

Walter.




Date: Wed, 11 Jan 2012 14:32:15 -0800
From: solv...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Vfp y Firebird bloquear Registros

Antonio Meza

unread,
Jan 11, 2012, 7:16:42 PM1/11/12
to publice...@googlegroups.com
Muchas gracias Walter, entendido y anotado, casi casi es para salir de paso ese comando mas no lo ideal.

Ahora en en caso del Generador, este no se incrementa si llamo el GEN_ID y por alguna razon aplico un RollBack el valor ya no incrementa? lo que necesito es controlar consecutivos que no se permita saltar si hay un error.

Y como a penas estoy aprendiendo a usar FireBird, creo un indice supuestamente le digo que sea UNIQUE y de todas formas me permite agregar valores duplicados en la tabla, se que no lo eh de estar hacuendo bien, estoy usando el SQL Manager, agrego los campos y luego me voy a la pestaña Indices le doy click derecho y le doy NEW INDICE, me abre una ventana donde me pide el nombre, no lo modifico, me paso FIELDS y seleciono por ejemplo el campo USUARIO y seleciono hasta abajo UNIQUE y lo agrego del lado derecho, le doy OK y ya me aparece el supuesto indice al campo, me voy a la pestaña DATA y agrego un registro o varios con el mismo nombre y me los guarda que me faltara.

saludos

Walter R. Ojeda Valiente

unread,
Jan 11, 2012, 7:36:18 PM1/11/12
to publice...@googlegroups.com
Hola Antonio

Si llamas al generador con un valor en el segundo parámetro distinto de cero entonces el número generado cambia. Los generadores funcionan afuera de las transacciones por lo tanto aunque hagas un ROLLBACK el valor del generador no regresa. Esto implica que puedes tener números salteados, por ejemplo: 1, 2, 3, 8, 9, 21, 22.

Si necesitas números consecutivos sin que existan números salteados en el medio entonces debes llamar a tu generador después de validar todo lo demás, es decir que debe ser tu última instrucción en esa transacción. Alternativamente, puedes usar un número negativo para que reste en lugar de sumar, pero esto generalmente no es recomendable salvo que seas extremadamente cuidadoso. En este caso lo más sencillo es establecer a tu número generado como clave primaria o clave única, de esa manera el Firebird no te permitirá tener duplicados.

Para que un valor no se duplique no debes usar ÍNDICES sino que debes usar CONSTRAINTS.

Cuando usas índices con la cláusula UNIQUE le estás diciendo que use solamente al primero de ellos, no le estás diciendo que no se puedan cargar valores duplicados. Si no quieres valores duplicados entonces debes usar una CONSTRAINT UNIQUE.

Saludos.

Walter.




Date: Wed, 11 Jan 2012 16:16:42 -0800
From: solv...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Vfp y Firebird bloquear Registros

Antonio Meza

unread,
Jan 11, 2012, 8:11:12 PM1/11/12
to publice...@googlegroups.com
jaja o sea que nada que ver lo que andaba haciendo que barbaridad, es que estoy muy familiarizado con mysql, bueno gracias Walter voy a buscar informacion sobre lo que me comentas para indices y hacer pruebas con los generadores para usar las cosas como deben ser y aprender bien y no salir del paso como muchas veces hacemos.

saludos!!

Oscar b

unread,
Aug 24, 2015, 11:01:29 PM8/24/15
to Comunidad de Visual Foxpro en Español
Sr. Walter, y de pura casualidad tomando el mismo ejemplo del codigo arriba expuesto (por el Sr. Anotonio) en vez de utilizar .... WITH LOCK 
entonces como bloqueo un registro?   es decir, por ejemplo, en un caso de inventario bloquearse hasta que haga su actualizacion y al final terminar con COMMIT?

Eric Natareno Guerra

unread,
Aug 25, 2015, 2:01:16 AM8/25/15
to Comunidad de Visual Foxpro en Español

El hilo es del 11 de enero de 2012, el señor Walter Ojeda se retiró de este foro hace ya bastante tiempo, pero con respecto a tu pregunta, no debes bloquear nada ya que el servidor de Firebird lo hace, si lees bien el hilo, verás que Walter ya dio solución a esto. Saludos

Eric Natareno Guerra

unread,
Aug 25, 2015, 2:02:12 AM8/25/15
to Comunidad de Visual Foxpro en Español

Foro, jaja digo grupo.

Oscar b

unread,
Aug 28, 2015, 8:58:04 AM8/28/15
to Comunidad de Visual Foxpro en Español
Bueno! Como dice el dicho, nunca es tarde para ....
Me da curiosidad que tema no se le diga coomo se desbloquea ese registro?
Hay situaciones empresqriales donde si es necesario hacer un bloqueo de un registro (vomo en foxpro usando el comando RLOCK y unlock in tabla para desbloquear. Como se desbloquea en firebird?
En mi caso x ejemplo se bloquea para actualizaciones mas no para consultas, ej, cuando se trata de varios ussuarios x alguna razon deben hacer ajustes de cantidades en un pedido y este se encuentra en proceso de alistamiento de las cantidades iniciales. Ese seria un caso mio.
Gracias.

Carlos Miguel FARIAS

unread,
Aug 28, 2015, 10:28:59 AM8/28/15
to Grupo Fox
Para el tema ver: https://firebird21.wordpress.com/2013/06/22/transacciones-optimistas-y-transacciones-pesimistas/
Para cualquier consulta sobre firebird: https://firebird21.wordpress.com, Walter, el "dueño" del foro, fue integrante de este foro, y es muy abierto a explicar los temas sobre firebird.
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza te acompañe en el camino de la luz (y mejor en la oscuridad, para no chocarte nada)
Reply all
Reply to author
Forward
0 new messages