FoxPro/Visual FoxPro - Transacciones de sql

   
Vista:

Transacciones de sql

Publicado por francisca (5 intervenciones) el 06/05/2008 18:31:42
RE:Transacciones en sql desde visual fox
Bueno, estoy trabajando con sql 2000, ahi tengo la base con las estructuras, entonces ya desarrolle la aplicacion, es decir me conecto a sql 2000 con autenticacion de windows, y utilizo sqlexec para mandar mis consultas y traerme los datos de slq a fox..y asi lleno los formularios con la informacion que el usuario va consultando,,,,,cuando hago un insert o un update a sql desde fox..odo me funciona...mi pregunta es ...yo no inicio ni termino una transaccion.....no he incorporado por ningun lado.....las transaciones de sql..ya que segun me documente existen transacciones explicitas e implicitas....opte por que sea el propio sql que maneje eso...y esa es mi pregunta...?????esta bien manejar transacciones implicitas???o si debo iniciar yo las transacciones y terminarlas yo¡¡¡como hago eso???
atte Francisca
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Transacciones de sql

Publicado por jose camilo (688 intervenciones) el 06/05/2008 19:09:46
si kieres k tu sistema solo funcione en sql server tonces utilizas procedimientos incluido,tigris y por demas en sql
a mi me guasta mas controlar todo yo asi si kiero cambien de sql a fox o al manejador k kieras lo puedo hacer sin problema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por Marvin Emilson Pineda (28 intervenciones) el 06/05/2008 19:39:32
Hola!!!...

Mira, usar transacciones implicitas mmmm.... digamos que no lo recomendaria ya que podria violar la integridad de la data, así que te recomendaria utilizar las transacciones explicitas. Como? cuando creas la conexión a SQL Server tienes una variable que contiene el ID de la conexión entonces utilizando SQLSETPROP(oConn, 'Transactions', 2) <<Busca la ayuda de este comando en VFP>> para que puedas iniciar y finalizar las transacciones utilizando SQLROLLBACK() y SQLCOMMIT() así pues si tienes un error devuelto por SQL podras deshacer los cambios hechos a la tabla afectada o tablas afectadas ya que hacer un SQLROLLBACK deshacer los cambios hechos a todas las tablas y lineas afectadas asi como el SQLCOMMIT()

IF SQLEXEC() > 0 Then
SQLCOMMIT()
else
SQLROLLBACK()
endif

recuerda... el SQLEXEC() con sentencia de Update o INSERT bloque la tabla en SQL Server asi que tienes que utilizar estos dos comandos de inmeadiato luego de un error para evitar problemas de acceso de parte de otros usuarios.

esta es mi recomendación
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por Francisca (5 intervenciones) el 06/05/2008 21:40:53
Muchas gracias por tu recomendacion, y me llama mucho la atención lo que agregas...si un usuario hace un select y dentro de ese select , un registro de ese conjunto de datos, lo esta modificando..con una transaccion ???esta bloqueado ese registro de lectuta/escritura....o esta bloqueado el conjunto de datos???
Si me puedes aclarar esta duda...gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por Marvin Emilson Pineda (28 intervenciones) el 06/05/2008 23:40:42
has una prueba... crea una conexión a SQL utilizando el modo de transacción manual, inserta un registro y no ejecutes el comando SQLCOMMIT(), abre otra instancia de VFP9 has otra conexión a SQL con o sin transaccion manual has una consulta a la tabla donde estas insertando en nuevo registro y veras que demorara el tiempo que tu tardes en aplicar el comando SQLCOMMIT() en la primera instancia de VFP.

esto no deberia ser problema para un sistema tal como lo mencione anteriormente ya que son milisegundos los que se tarda SQL en devolver si la sentencia ejecutada fue exitosa o no para lo cual luego de actualizar las tablas necesarias se debe de aplicar el SQLCOMMIT() o SQLROLLBACK() dependiendo el caso...

ahora tambien puedes utilizar la sentencia SELECT FROM <<tabla>> NOLOCK este ultimo parametro hara que la sentencia Select devuelva los registros bloqueados sin las modificaciones que se esten haciendo a esos registros.

saludos y espero que esto responda a tus dudas ahora!!!... como repito si utilizas bien los comando no deberia haber problema alguno... no tengas miedo has pruebas y saldras de las dudas por ti misma
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por Marvin Emilson Pineda (28 intervenciones) el 06/05/2008 23:51:42
Perdon!!!... la sentencia select debera ser asi

SELECT * FROM <<tabla>> WITH (NOLOCK)

corrigiendo mensaje anterior
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por Francisca (5 intervenciones) el 07/05/2008 15:37:49
Sabes....Te agradezco tu ayuda...me has dado la Luz¡¡¡¡jajaja
Ahora haré la prueba..y saldré de muchas dudas¡¡¡¡
Saludos......y de nuevo gracias por tomarse el tiempo de responderme¡¡¡
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por richard marriaga (174 intervenciones) el 08/05/2008 18:22:00
Amigo este un ejemplo que te puede ayudar a despejar las dudas

copialo para que lo veas mejor y con la explicaciones que te dieron anteriormente tendras mas claro ese tema


Como ves el equivalente del BEGIN TRANSACTION es el SQLSETPROP(). En las líneas anteriores se podría meter un control de devolución de parámetros para controlar que el valor devuelto por cada uno de los SQLEXEC es el correcto. Podríamos escribir algo así:



1)

? SQLSetProp(gnhandle,’Transactions’,2) && Devuelve 1 si ha habido un éxito

lnresultado = SQLExec (gnHandle, “delete pedidos where cod_ped = 3”)

IF lnresultado <>1

SQLRollback(gnhandle)

Messagebox(“Algo ha ido mal”)

Return

ENDIF

lnresultado = SQLExec (gnhandle,” “delete lineas_de_pedidos where cod_ped = 3”)

IF lnresultado <>1

SQLRollback(gnhandle)

Messagebox(“Algo ha ido mal”)

Return

ENDIF

SQLCommit()

? SQLSetProp(gnhandle,’Transactions’,1)

Messagebox(“Se ha borrado correctamente”)



No obstante, trabajar con con el SQLSetProp(gnhandle,’Transactions’,1) es un poco oscurantista ya que desde Fox podemos trabajar directamente con las transacciones explícitas del SQL Server:

2)

El anterior código lo podríamos traducir a éste:



SQLEXEC(nHandle,’BEGIN TRANSACTION’)

Lnresultado1 = SQLExec (gnHandle, “delete pedidos where cod_ped = 3”)

Lnresultado2 = SQLExec (gnhandle,” “delete lineas_de_pedidos where cod_ped = 3”)



IF lnresultado1 = 1 and lnResultado2 = 1

SQLEXEC(nHandle,’IF @@TranCount > 0 COMMIT’)

ELSE

SQLEXEC(nHandle,’IF @@TranCount > 0 ROLLBACK’)

ENDIF



Como se puede ver este código es mucho más limpio y fácil de seguir. La variable @@TranCount nos devuelve el número de transacción.



En SQL Server tenemos algunas otras opciones que nos pueden servir de utilidad como la variable @@NESTLEVEL que nos indica en que nivel de profundidad de las transacciones estamos metidos.



De todos modos creo que con estos ejemplos, hay suficiente.

richard marriaga
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por Marvin Emilson Pineda (28 intervenciones) el 08/05/2008 19:47:39
mmm... interesante, no es cuestion de discutir mi observación pero!!!... en cuestion de logica y programación que sentido tiene ejecutar una sentencia SQL hacia SQL Server que inicie una Transaccion luego por medio de otra sentencia hacia SQL Server verificar si todo salio bien cuando con una sola linea al inicio de la session a SQL defines el modo de transaccion que utilizaras en todo el sistema?

la sugerencia seria aplicable si VFP no tubiera como definir el modo de transaccion a utilizar, en este caso que VFP lo puede hacer desde una sola linea para toda la aplicación no le veo la logica ni el beneficio.

es mi punto de vista
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por Beatriz (66 intervenciones) el 08/05/2008 21:15:42
jajaajajaj.....comparto tu opinion Marvin¡¡¡¡Saludos¡¡¡
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por Francisca (1 intervención) el 08/05/2008 21:17:47
Mil gracias por tu aporte¡¡¡le sacaré provecho...........
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por Marvin Emilson Pineda (28 intervenciones) el 08/05/2008 23:15:02
no se trata de oscurantista lo que veo es que no sabe la aplicación o funcionalidad del comando SQLSETPROP() ya que si a esas instancias nos vamos tambien el comand SQLEXEC() es oscurantista ya que bien podriamos mejor utilizar el archivo SQLCMD.EXE que trae el SQL Server cual tambien funcionaria y podria reemplazar los comando de VFP

pero bien!!! al final es cosa de gustos como hacerlo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por richard marriaga (174 intervenciones) el 10/05/2008 00:19:49
se como funciona y su aplicacion, aqui el caso darle solucion a los que piden ayuda no escribir y decir una cosa y la otra.

Es mostrarle al que pide ayuda ejemplos como debe solucionar el caso

richard
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por Cesar Sanchez (11 intervenciones) el 29/10/2008 20:11:13
Me puedes ayudar, estoy usando begin transaction y me da problemas como multiusuario, tienes un ejemplo o rutina para que no se me caiga al grabar otro usuario

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Transacciones de sql

Publicado por Carlos Uriel Pareja (1 intervención) el 21/05/2011 20:25:04
que ocurre si en medio de la transacción la conexión coon el servidor se cae??? que pasa con la transacción y con el bloqueo de las tablas????
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar