![]() |
DbExpress - Transacciones - más de un clientDataSet
Hola foro !!!
Estoy trabajando con D7, PostgreSql y utilizo dbexpress. Quisiera saber como trabajan uds. cuando tienen varios clientDataSet y desean que todos o ninguno se actualice. Supongo que para esto se tienen que utilizar las transacciones. Lo que he hecho es lo siguiente: var TD: TTransactionDesc; begin if not SqlConnection1.InTransaction then begin TD.TransactionID := 1; TD.IsolationLevel := xilREADCOMMITTED; SqlConnection1.StartTransaction(TD); try client1.ApplyUpdates(0); client2.ApplyUpdates(0); SqlConnection1.Commit(TD); except SqlConnection1.Rollback(TD); end; end; end; Lo he probado y funciona !!! solo un detalle que no entiendo ... si el client1 está ok y el client2 está con error, el 'commit' es el que resuelve todo y no se actualiza ninguno de los 2 client. Es decir que nunca se ejecuta el RooBack pero igualmente no graba nada (ninguno de los 2 client). Me gustaría que me aconsejen como suelen trabajar uds. cuando tienen que actualizar varios ClientDataSet con una misma transacción. Gracias anticipada por la ayuda. |
Hola,
¿has probado a usar commitRetaining en vez del commit? Saludos Virginia |
No he estado usando el CommitRetaining ya que según entiendo es para cuando se usa con componentes de IB. Yo estoy usando los componentes de dbexpress (SQLConnection, SQLDataSet, DataSetProvider y ClientDataSet).
Gracias por las ideas que puedan darme. |
Hola
En efecto el CommitRetaining es propio de Interbase/Firebird y solo se puede llamar desde componentes específicos para IB. Tu código está bien, yo utilizo algo parecido. ¿ Porqué dices que no se ejecuta el RollBack ?. Si el ApplyUpdates del segundo ClientDataset falla, entonces entras en la sección except y se ejecuta el RoolBack. Saludos. |
El applyUpddates, no genera ningún error, si no que devuelve el numero de errores que se han producido
function applyupdates(...):integer; por lo que si se quiere controlar en caso de erro se puede poner algo así if client1.ApplyUpdates(0)+client2.ApplyUpdates(0)=0 then SqlConnection1.Commit(TD); else SqlConnection1.Rollback(TD); |
Marc, aunque no lo creas (yo tampoco lo podía creer) el código que antes escribí nunca entra en el rollback, aunque ocurra un error en uno de los client. Supongo que lo que dice Juliá tiene razón ... eso de que applyupdate no genera un error.
Lo interesante que luego de aplicarse los dos clientDataset (según mi ejemplo) y llegar a la línea donde está el commit no se realiza ningún commit a la base, es decir que de alguna manera detectó el error, pero no salió por el except |
puede que el commit no tenga efecto ninguno si el primer fallo está en el primer cambio que realizas en la base de datos.
El applyupdates(x) se para en el numero x de errores que tú le digas, si le pones 0, se parará en el primer error y el resto de cambios los ignorará, entonces el commit tan sólo realizará los cambios que haya permitido el applyupdates. |
Gracias por la ayuda !!
|
La franja horaria es GMT +2. Ahora son las 08:02:23. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi