![]() |
FB+IBX+IBTransaction+ClientDataSet
Utilizo IBX+ClientDataSet para acceder a FB 2 .
Utilizo un componente IBDataBase un componente IBTransaction y el esquema de conexion de a cada Tabla viene siendo el que sigue IBQuery<---DataSetProvider<---ClientDataSet<---DataSource<---DBGrid si hago un cambio en el DBGrid se dispara el evento AfterPost, AfterDelete en el cual hago un ClienteDataSet.ApplyUpdates(-1); Todo funciona perfecto. El problema es si abro el programa en otro ordenador accediendo de forma concurrente sobre la misma tabla y base de datos. El segundo Ordenador no se entera de los cambios que ha hecho el primero a no ser que haga un commit. Es decir Si A los eventos AfterPost y afterDelete les pongo el codigo ClientDataSet.ApplyUpdates(-1); if IBQuery.Transaction.InTransaction then IBQuery.Transaction.commit; Es esto normal. O estoy haciendo algo mal |
¡Hola!
Un compañero acaba de tener una duda similar. Creo que si echas un vistazo a lo que comento en este hilo se despejarán algunas de tus dudas: http://www.clubdelphi.com/foros/showthread.php?t=57459 También considera que la naturaleza de una transacción es precisamente "aislar" un grupo de operaciones de tal manera que sólo la aplicación que las ha ejecutado puede verlas hasta que ésta las da por confirmadas. La transacción asegura que se realicen todas las operaciones sin problema alguno o bien que no se confirme ninguna de ellas, pero que no quede en la base de datos la información "a medias". La anterior es una de las varias razones por las cuales la gente prefiere el uso de bases de datos cliente-servidor en lugar de las antiguas y frágiles bases de datos de escritorio (Access, Paradox, dBase, Fox, etc.). Cabe mencionar que la transacción se inicia con cierto "nivel de aislamiento", y dependiendo de este nivel es que una conexión podrá ver o no los cambios aún no cometidos (confirmados) por otra conexión. Tradicionalmente se emplea el nivel de aislamiento "Read Committed", el cual no permite consultar información que todavía no haya sido cometida por otras transacciones. Espero haber ayudado a orientarte. No dejes de retroalimentar el hilo con tus inquietudes al respecto. Un abrazo. Al González. :) |
he mirado en el hilo que me comentas, ya lo habia estado leyendo, pero al tratarse de distintos componentes (creo en ese hilo se utiliza FIB) decidí abrir este segundo hilo.
En mi caso símplemente es que tenia entendido que el DataSetProvider se encargada de iniciar (startTransaction) y finalizar (Commit o rollback) las transacciones. |
Cita:
http://www.clubdelphi.com/foros/show...48&postcount=6 |
Tengo el mismo problema como indica AI Gonzalez, he hehcho de todo pero nada. Si alguien encuentra la solución que la postee.
Gracias y saludos. |
el caso es que tengo un tibtransaction y un tibdatabase desde que conecto a la base de datos (tibdatabase.open) si el componente tibtransaction inicia una transaccion (Por lo tanto me veo obligado a realizar un commit tras realizar un applyupdates en el client dataset).
en vista de esto he asociado un componente transaccion para el componente ibquery es decir (diferente del que tiene asociado el componente tibdatabase) TIbtransaction<--TIBQuery<--TDataSetProvider<--TClientDataSet<--TDataSource<---TDBGrid En este caso si yo no hago en mi codigo un tibtransaction.Starttransaction no se debería haber iniciado una transacción y entiendo que el TDataSetprovider deberia manejar las transacciones por mi. Pero sigo teniendo el mismo problema (Problema que en realidad se soluciona si siempre que hago un applyupodate a continuacion hago una commit de la transaccion asociada) |
Lo he solucionado haciendo un commit tras cada Applyupdates pero no se si es lo correcto, el caso es que funciona
|
¿Donde haces el commit en el Servidor de Capa Intermedia o en la Aplicación Cliente?
saludos. |
Ya he conseguido realizar los cambios en la BD pero solo se realizan cuando cierro la Aplicacion. ¿Que tengo que hacer para se realicen en el momento?
|
Rockin en vez de cerrar haz un commit y seguramente se te grabaran los datos (po al menos eso es lo que me pasa a mi).
En mi caso estoy haciendo pruebas asi que tengo todo en un modulo de datos. Pero supongo que lo haras donde tengas el componente transaccion o no |
Hola a todos.
Para este tema Yo deje un ejemplo de como lo solucione. http://www.clubdelphi.com/foros/show...5&goto=newpost No se si es lo mejor, pero me funciona. Saludos. Espero que sirva de algo. |
con DBX
Siempre me a ido perfecto, desde la versión 1 de Firebird hasta la 2.1 que utilizo ahora
al Aceptar y hacer el Post i el Apply, cualquier cliente ya ve los datos gravados, en el acto. SQLQuery - DatasetProvider - ClientDataset try ClientDataSet1.Post; ClientDataSet1.ApplyUpdates(0); except ClientDataSet1.Cancel; ClientDataSet1.CancelUpdates; end; en el TSQLConnection (solo uno por aplicación) procedure TFModuloIni.SQLConnection1BeforeConnect(Sender: TObject); begin SQLConnection1.ConnectionName := 'MiConexion'; SQLConnection1.DriverName :='Interbase'; SQLConnection1.Params.Values['BlobSize'] := '-1'; SQLConnection1.Params.Values['CommitRetain'] := 'False'; SQLConnection1.Params.Values['Database'] := Utilidades.DataBaseUtil; SQLConnection1.Params.Values['ErrorResourceFile'] := ''; SQLConnection1.Params.Values['LocaleCode'] := '0000'; SQLConnection1.Params.Values['Password'] := 'masterkey'; SQLConnection1.Params.Values['RoleName'] := 'RoleName'; SQLConnection1.Params.Values['ServerCharSet'] := ''; SQLConnection1.Params.Values['SQLDialect'] := '1'; SQLConnection1.Params.Values['Interbase TransIsolation'] := 'ReadCommited'; SQLConnection1.Params.Values['User_Name'] := 'sysdba'; SQLConnection1.Params.Values['WaitOnLocks'] := 'True'; end; Salut |
Cita:
|
La franja horaria es GMT +2. Ahora son las 12:53:45. |
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