Power Builder - problemas con rollback

 
Vista:

problemas con rollback

Publicado por achafio (88 intervenciones) el 26/09/2009 05:49:32
Mi problema es que no realiza el rollback y graba la información de los dws sin q se ejecute el commit, un ejm:

if dw_1.update() = -1 then
rollback using sqlca;
end if

if dw_2.update() = -1 then
rollback using sqlca;
end if

commit;

Ahora si el rollback que se ejecuta es del dw_2. no graba los datos del dw_2 pero si del dw_1. cuando no deberia grabar de ninguno ya que nunca llega a hacer commit, podrian decirme a que se debe esto.
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:problemas con rollback

Publicado por miguel (153 intervenciones) el 26/09/2009 11:53:25
probablemente tienes puesto el sqlca.autocommit a true. intenta hacer sqlca.autocommit = false y verás ...

(si usas una odbc como por ejemplo el de as400 / DB2, existen unas opciones en el perfil de conexión que afectan al comportamiento del commit.)
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:problemas con rollback

Publicado por wend (95 intervenciones) el 26/09/2009 17:08:03
Si lo que intentas es guardar una transacción que involucra a 2 DW, entonces una forma de hacerlo es:

if dw_1.Update(true,false) = 1 then
if dw_2.Update(true,false) = 1 then
COMMIT using SQLCA;
Else
ROLLBACK using SQLCA;
End If
else
ROLLBACK using SQLCA;
end if

y no olvides la recomendación de Miguel
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:problemas con rollback

Publicado por achafio (88 intervenciones) el 26/09/2009 23:28:14
tengo el autocommit en false, verifique eso y de todas maneras lo graba, otra consulta yo solo uso dw_1.update() y no el dw_1.update(true,false) claro intente hacerlo de esta manera

if dw_1.update(true,fase) = -1 then
rollback using sqlca;
end if

pero igual graba ahora mi pregunta es cual es la diferencia de usar .update() y .update(true,false)
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:problemas con rollback

Publicado por miguel (153 intervenciones) el 27/09/2009 00:16:55
no debería pasar eso ....

Búsca algo de información sobre el parámetro 'lock' de la conexión a base de datos: existe algo así como un bloqueo 'optimista' y pesimista, tienen que ver con que si los cambios son visibles a otros usuarios o no, antes de hacer commit.

Lo que me extraña es lo siguiente: sea como sea, si el autocommit está a false, al hacer un rollback; el dato debería quedar como antes del update( ). Verifica en tu código antes de hacer el dw_1.update() "if sqlca.autocommit = true"

qué quiere decir exactamente 'igual graba' ? No será que estás haciendo un select y dices que se graba porque te ha salido el dato cambiado??? Aunque no hayas hecho commit, para ti los cambios sí son visibles cuando haces select. (para los demás usuaris tendrás que hacer un commit normalmente para que lo vean.

puedes adjuntar tu código?, con que base de datos estás y con qué perfil te conectas?
(dbparm)

con qué odbc o database driver te estás conectando a qué database???

En 'debug' realmente llegas a ver que el sqlca.autocommit está a false, o lo tienes a false en tu perfil de conexión???
Cuando el autocommit está a false y tu por ejemplo insertas un dato en la base de datos, ese dato nuevo normalmente no lo ven otros usuarios hasta que tu hayas hecho commit.
Tú sin embargo, sí lo verás cuando haces un select, ya que tu mismo has hecho el cambio (aunque todavía no hayas hecho el commit, te saldrá con select).

Para el resto de tus dudas sobre la función Update( ):
------------------------------------------------------------------------
el true false tiene que ver con dos cosas (2 parámetros): uno te hace un acceptText( ) sobre el datawindow antes de hacer el update para que entre el último dato editado y posiblemente sigue el cursor en la columna (acceptText( ) hace que entre en el buffer de cambios). El otro parámetro indica si se resetean los updateflags después sí o no. Te vale por si tu transacción por ejemplo sólo puede ser grabado con commit cuando tanto el update sobre dw1 como dw2 hayan ido bien. si necesitas más información cómo usarlo te indico la ayuda de powerbuilder o si quieres te busco algo de información en castellano.

algo se nos escapa, pero ya lo averiguaremos,
un saludo.
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:problemas con rollback

Publicado por Omar (1 intervención) el 27/11/2013 18:34:21
Usando el Autoomit en false , si funciona , esta completamnete verificado...seguro se esta poniendo el comit en true
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
Imágen de perfil de Mario Amaya

RE:problemas con rollback

Publicado por Mario Amaya (27 intervenciones) el 28/11/2013 18:12:12
Yo creo que el problema es la forma en que estas haciendo tu programa. Te pongo lo que tienes originalmente y como deberia de ser (ve los sangrados de linea)

Tu codigo

if dw_1.update() = -1 then
rollback using sqlca;
end if

if dw_2.update() = -1 then
rollback using sqlca;
end if

commit;

Mi codigo
dw_1.update()
// Uso el sqlca.sqlcode en lugar del valor retornado por el update, debido a que este puede devolver 1, -1 o null
// Mientras que el sqlcode, cualquier valor < 0 es un error.
if sqlca.sqlcode < 0 then
rollback using sqlca;
else
dw_2.update()
if sqlca.sqlcode < 0 then
rollback using sqlca;

else
commit;
end if
end if

Si te fijas, voy evaluando en cascada lo cual asegura que el proceso se detenga en el primer error que se presente y nunca lle al commit.

Espero haber ayudado con este aporte.

Saludos desde El Salvador
Si alguien me quiere contactar puede hacerlo tambien a traves de mi skype ([email protected])
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