VFP con MySQl y Transacciones

487 views
Skip to first unread message

pablo b(La Pampa)

unread,
Jul 23, 2011, 11:45:01 AM7/23/11
to Comunidad de Visual Foxpro en Español
Hola Foro, buen dia, le comento a ver si me pueden sacar dudas y
ejemplo cortito, resulta que me estor iniciando con MySQl, siempre
trabaje con las DBF pero bueno eso ya paso a la historia o al menos
eso creo, bien ahora el tema es con MySQl, ya cree varios forms e hice
prueba y he logrado insertar registros, hacer update, borrar y todo lo
demas, me conecto bien, todo eso barbaro.
Ahora bien, el tema pasa con el uso de la aplicacion en red, cuando
tengo mas de 1 usuario usando las mismas tablas o el mismo como hago
para no tener conflictos o registros duplicados y evistar posibles
errores. Para eso estuve leyendo un PDF sobre el tema de las
Transacciones. Ahora bien no logro entender muy bien su uso, porque
segun dice:

ANTES DEL CODIGO
Por default, MySQL corre en modo de “autocommit”. Esto es que tan
pronto como
ejecutes una sentencia que actualice (modifique) una tabla, MySQL
grabará los cambios
en el disco.
En otras palabras, antes de utilizar una transacción es necesario
“quitar” el modo
autocommit; esto se hace asignando el valor 0 (cero) a la variable
AUTOCOMMIT y eesto
se logra con el siguiente comando:
SET AUTOCOMMIT=0
o bien sino quiero poner el autocommit =0 puedo usar el Start
transaction y despues poner el codigo para grabar o u rollback sino
quiero hacer.
Pero mas abajo en el pdf me dice esto:

TRANSACCIÓNES EN ENTORNO MULTIUSUARIO
Los cambios hechos durante una transacción no se graban en el disco
hasta que se
ejecute el comando COMMIT, por lo que otras conexiones no tienen
acceso (o
conocimiento) de los cambios realizados durante la transacción.

Entonces mi duda es donde esta la ventaja del uso de las transacciones
o como se deben usar para cuando 1 usuario esta haciendo uso de un
form o tabla no se generen errores o duplicados. o sea lean el titulo
que puse en mayuscualas de Antes del codigo y el otro titulo de
Transacciones en entorno multiusuario, creo que me daria error en un
uso en red al momento de cargar datos. Si tiene un ejemplo o como se
hace

Muchas Graias, mil perdones por el texto tan largo en la explicacion,
espero se entienda mi duda y agradezo todo tipo de ayuda.

Pablo
La Pampa

Carlos Miguel FARIAS

unread,
Jul 23, 2011, 6:35:41 PM7/23/11
to publice...@googlegroups.com
Que motor usas para las tablas mysql, myisam o innodb, solo estas últimas soportan transacciones (e integridad referencial), las primeras, funcionan parecido a las dbf (archivos independientes) con el agregado de la seguridad por usuario (que no tienen las dbfs).
Si instalastes el mysql, y haces todo lo que dices, ya estas automaticamente trabajando en modo multiusuario.
Para evitar registros duplicados, debes verificar las claves antes de insertar (las nuevas) o de modificar (en casos de claves unicas). En caso de intentar insertar duplicadas, tendras un error del motor (que tendras que capturar los errores con SHOW ERRORS, que te crea tambien un cursor si la ejecutaste con sqlexec).
El tema transacciones no tendria nada que ver con la cantidad de usuarios.
Cualquier sentencia SQL, en mysql, se ejecuta completa o no se ejecuta.
La transaccion lo que permite es "envolver" un conjunto de sentencias SQL, y dentro de esa "envoltura", ir controlando ciertos elementos que se cumplen o no (eso depende de tu requerimiento de programación). Si por alguna razón se necesita cancelar, podes cancelar todo lo que se estaba ejecutando dentro de la "envoltura", dejando todas las tablas como al principio.
Saludos Miguel: at La Pampa too.

pablo b(La Pampa)

unread,
Jul 23, 2011, 7:23:40 PM7/23/11
to Comunidad de Visual Foxpro en Español
Hola carlos, gracias por tu respuesta, uso INNODB como base de datos,
consultaba por el tema de las transacciones por eso mismo que pregunte
para no tener problemas de duplicados o errores en la tabla en un
entorno multiusuario, vos me decis que controlando al momento de la
carga verifique que el codigo cargado no exista para al momento de
hacer un insert o update no tenga problemas y con eso evito el tener
que usar las transacciones ¿no? es eso lo que entiendo me queres
decir???, asi lo hago ahora actualmente pero consulte por el tema
transacciones por lo de multiusuario para evitar un duplicado al
momento de grabar en mi tabla, el form lo uso de sesion privada de
datos???? o como seria.

Muchas Gracias

Pablo - La Pampa (entendi bien, vos sos de aca tambien?? si es asi de
donde??) por ahi no podemos juntar y me sacas algunas dudas lo hago
por hobby a la programacion y me gusta,programo para la aplicacion de
mi negocio de venta de telefonia celular
Avisame


On 23 jul, 19:35, Carlos Miguel FARIAS <carlosmiguelfar...@gmail.com>
wrote:
> Que motor usas para las tablas mysql, myisam o innodb, solo estas últimas
> soportan transacciones (e integridad referencial), las primeras, funcionan
> parecido a las dbf (archivos independientes) con el agregado de la seguridad
> por usuario (que no tienen las dbfs).
> Si instalastes el mysql, y haces todo lo que dices, ya estas automaticamente
> trabajando en modo multiusuario.
> Para evitar registros duplicados, debes verificar las claves antes de
> insertar (las nuevas) o de modificar (en casos de claves unicas). En caso de
> intentar insertar duplicadas, tendras un error del motor (que tendras que
> capturar los errores con SHOW ERRORS, que te crea tambien un cursor si la
> ejecutaste con sqlexec).
> El tema transacciones no tendria nada que ver con la cantidad de usuarios.
> Cualquier sentencia SQL, en mysql, se ejecuta completa o no se ejecuta.
> La transaccion lo que permite es "envolver" un conjunto de sentencias SQL, y
> dentro de esa "envoltura", ir controlando ciertos elementos que se cumplen o
> no (eso depende de tu requerimiento de programación). Si por alguna razón se
> necesita cancelar, podes cancelar todo lo que se estaba ejecutando dentro de
> la "envoltura", dejando todas las tablas como al principio.
> Saludos Miguel: at La Pampa too.
>
> > La Pampa- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Carlos Miguel FARIAS

unread,
Jul 25, 2011, 8:25:23 AM7/25/11
to publice...@googlegroups.com
Perdon si no fui claro.
Una circunstancia es el control de claves duplicadas (sobre primaria o unicas) y otro tema son las transacciones.
Las claves duplicadas son circunstancias dependiente de los datos, por ejemplo, cargas un cliente, el empleado supone que es nuevo, y ya figuraba en la base, al cargar el nro. de documento, el documento ya existe, y daria un duplicado.
La inconsistencia podes controlarla proactiva o reactiva.
Proactiva, el dato es verificado antes de intentar grabar y se informa que ya existe y en ese control, podes detectar quien es el otro cliente que obstenta el mismo documento.
Reactiva, intentas insertar, el SGBD detecta la clave duplicada y te manda un mensaje de error, en este caso, no podes saber cual cliente ya lo estaba usando.

En cuanto a las transacciones, son como comentaba "una envoltura" que crea un ambito donde todas las instrucciones SQL que incluye, se ejecutan como si fuera una sola desde el punto de vista de efecto final.
Al medio de cada instrucción se puede hacer alguna verificación, dependiente de la logica del negocio, y si se detecta alguna circunstancia de rechazo, se cancela el proceso completo (todo lo que esta dentro de la envoltura) y la base de datos queda como si no se hubiese ejecutado ninguna de las operaciones sql.

Ejemplo

*inicio transaccion...
START TRANSACTION
UPDATE ....
IF CONTROL='RECHAZO'
   ROLLBACK
ENDIF
INSERT ....
IF CONTROL='RECHAZO'
   ROLLBACK
ENDIF
DELETE ....
IF CONTROL='RECHAZO'
   ROLLBACK
ENDIF
COMMIT
Las modificaciones a la base no quedan firmes hasta que no se ejecuta el commit final, mientras tanto, en cualquier caso que la condicion de control produzca un rechazo, la hacer un ROLLBACK, la base queda igual que al inicio (START...).
Reply all
Reply to author
Forward
0 new messages