![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Para el tema de insertar y cerrar transacciones mira este link
Básicamente debes hacer esto
y mejor si lo haces así
Última edición por duilioisola fecha: 18-11-2010 a las 20:43:54. |
|
#2
|
||||
|
||||
|
Duilioisola te recomiendo que cambies las excepciones de captura de error por esta :
Puesto que estás dejando abierta la transacción (y los registros bloqueados) hasta que el usuario acepta el mensaje de error. Y no hay ninguna necesidad de ello (imagínate que el usuario mantiene el mensaje en pantalla, para poder llamar al servicio técnico. Igual te deja media hora con los registros bloqueados). Siempre se debería evitar que las transacciones (especialmente las que ya han modificado algo) permanezcan abiertas a la espera de una acción del usuario. Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). Última edición por guillotmarc fecha: 18-11-2010 a las 21:03:30. |
|
#3
|
|||
|
|||
|
Hola,
En mis programas suelo utilizar los componentes IBX + datasetprovider + clientdataset. Y abro las consultas en clientdataset y realizo las actualizaciones mediante el ApplyUpdate(). Esto es lo que suelo utilizar para las consultas y las consultas actualizables. En el programa de importacion que comentaba lo que si es cierto que realizo un commit por cada nuevo registro que añado o modifico, esto lo realizo por que en caso de error en un registro no quiero que afecta a otros posibles registros. Y me deje de importar un bloque de xxx registros. Tambien decir que en este programa de importacion estoy utilizando Ibquery + IbupdateSQL y en otros casos utilizo ibx + dsp + clientdataset. Unos procesos de importacion usan un modelo de datos y otros el otro. Por cierto, para las consultas de modificacion, insercion y/o procedimientos alm. como los utilizais con los clientdataset para sincronizar todo en una transaccion? Muchas gracias a todos. Saludos,
__________________
Saludos, Bitman |
|
#4
|
||||
|
||||
|
Hola.
Cita:
Respecto a como sincronizar en una misma transacción varias operaciones. Si tienes abierta una transacción, el ClientDataset realizará los cambios dentro de esa transacción en lugar de abrir una de nueva, por lo que puedes encadenar varios cambios y finalizar la transacción al final para aglutinarlo todo. No te olvides de finalizar por ti mismo la transacción, puesto que si la dejas abierta es cuando empiezas a tener problemas de bloqueos y crecimiento de la base de datos. Te recomiendo que hagas un seguimiento de las transacciones existentes en tu programa. Parece que algún punto debes dejar alguna abierta.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). Última edición por guillotmarc fecha: 19-11-2010 a las 12:08:42. |
|
#5
|
||||
|
||||
|
Por cierto, yo en FIBPlus pongo un TimeOut de 1 a mis transacciones para asegurarme de que nunca queden abiertas. No sé si en IBX tienes algo similar.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
#6
|
|||
|
|||
|
Hola,
respecto a esto: Cita:
Pero cuando en el mismo proceso de guardar esos cambios quiero incluir en una misma transaccion una actualizacion o insercion mediante instrucciones SQL (insert, update) o un procedimiento almacenado. Por ejemplo solamente con componentes IBX lo haria asi: Código:
/* componente IBQuery + IBUpdateSQL*/
IBXQuery->Edit();
IBXQuery->FieldByName("Ejercicio")->AsInteger = Ejercicio;
IBXQuery->Post();
/* insert, update o procedimiento */
IBXQuery2->ParamByName("P_EJERCICIO")->AsInteger = Ejercicio;
IBXQuery2->ExecSQL();
TIBTransaction->Commit(); /* Confirmo todas las operaciones anteriores */
Código:
ClientDataSet->Edit();
ClientDataSet->FieldByName("Ejercicio")->AsInteger = Ejercicio;
ClientDataSet->Pots();
/* insert, update o procedimiento */
IBXQuery2->ParamByName("P_EJERCICIO")->AsInteger = Ejercicio;
IBXQuery2->ExecSQL();
ClientDataSet->ApplyUpdates(-1);
TIBTransaction->Commit(); /* Confirmo todas las operaciones anteriores */
__________________
Saludos, Bitman |
|
#7
|
||||
|
||||
|
Hola.
Yo te recomendaría que definas una sola transacción y que la controles manualmente (la inicies y la finalices tú, en lugar de dejar que se haga implícitamente). Cita:
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
#8
|
||||
|
||||
|
Muy buen apunte guillomarc.
Habrá que dejarle un mensajito en le blog de Delphi al Limite que es de dónde saqué el código. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| rendimiento de PHP | Ñuño Martínez | PHP | 1 | 20-09-2006 06:29:55 |
| Problema grave de rendimiento | ACK | Firebird e Interbase | 13 | 12-09-2005 17:10:44 |
| ¿ Cúal es el Rendimiento ? | sierraja | Firebird e Interbase | 7 | 12-09-2005 15:37:44 |
| Rendimiento TStringList | Delphius | Varios | 7 | 13-06-2005 07:16:46 |
| rendimiento | carlomagno | Firebird e Interbase | 14 | 06-07-2004 17:05:13 |
|