Ir al contenido


Foto

Duda con pruebas en DataSnap 2010


  • Por favor identifícate para responder
3 respuestas en este tema

#1 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 25 noviembre 2009 - 08:46

Buen día compañeros. Estoy realizando unas pruebas en DataSnap 2010, contra una base de datos Firebird 2.1 usando el driver nativo para Firebird,  configurados de acuerdo a los ejemplos de embarcadero (IsolationLevel = ReadCommited), en el servidor tengo un módulo TDSServerModule con un TSQLQuery que trae los datos de una tabla (Ciudades) de 4 campos, con un TDatasetProvider que utilizo para insertar o agregar registros, en este provedor capturo el evento BeforeUpdateRecords para obtener la clave principal desde un generador y el evento AfterUpdateRecords para insertar un registro en una tabla de auditoría y insertar otro registro en  otra tabla en la que normalizo los nombres de las ciudades (quito tildes, paso a mayusculas, quito espacios que sobran etc.. ).



delphi
  1. procedure TDMVarios.CiudadesAfterUpdateRecord(Sender: TObject;
  2.   SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind);
  3. begin
  4. Controlar('CIUDADES', 'CIUDADES', 'ID_CIUDAD', DeltaDS, UpdateKind);
  5. if (UpdateKind <> ukDelete) then
  6.   if Modificado(DeltaDS, 'CIUDAD;DEPTO') then
  7.       AsociarNombres(DeltaDS.FieldByName('ID_CIUDAD').OldValue,
  8.     'ASONOM_CIUDADES', 'ID_CIUDAD');
  9. end;
  10.  
  11. procedure TDMVarios.CiudadesBeforeUpdateRecord(Sender: TObject;
  12.   SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
  13.   var Applied: Boolean);
  14. begin
  15.   if UpdateKind = ukInsert then
  16.     DeltaDS.FieldByName('ID_CIUDAD').NewValue := NuevoID(Varios);
  17. end;




En el lado cliente uso un TDSProviderConnection para conectar el ClientDataset con el proveedor del servidor, he dispuesto un Timer que cada segundo inserta un regsitro (vía ApplyUpdates)  y se inhabilita en caso de excepción, se conecta bien, hace todo lo esperado, el problema surge cuando abro otro u otros clientes y ejecuto el timer, entonces insertan  unos cuantos registros y se bloquean clientes y servidor.

Tambien he hecho la prueba escribiendo un metodo que hace el proceso de inserción de la tabla  ciudades y la actualización de las otras dos tablas (sin usar el TDatasetProvider), y lo ejecuto desde el cliente vía Proxy, y ocurre exactamente lo mismo.

Espero haberme explicado.

Preguntas:
Porqué ocurre esto? 
Que estoy haciendo mal?
Es factible colocar algo al llamar ApplyUpdates o al llamar el metodo via proxy para que en caso de encontrar problemas diferentes (a claves o constrains)  no bloquee  el cliente ni el servidor?

De antemano muchas gracias por su ayuda.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 25 noviembre 2009 - 02:05

Me parece que este es un tema de transacciones.

Salud OS
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 25 noviembre 2009 - 03:03

Me parece que este es un tema de transacciones.

Salud OS


Estoy de acuerdo contigo Egostar, solo que en dbExpress y por lo menos con los TDatasetProviders se presume que estos inician sus propias transacciones automáticamente, mas sin embargo probaré con la clase TDBXTransaction, y probaré cambiando la propiedad WaitOnLocks de la conexión,  ya les comentaré los resultados;  lo desconcertante es que no lanza ninguna excepción sinó que bloquea los clientes y el servidor de una, por eso quisiera encontar la forma de por lo menos manejar el problema...... que por lo menos avise.

Gracias y saludos.
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 25 noviembre 2009 - 03:13

Dale una leída a este buen artículo de Dr.Bob en especial a la sección dbExpress Transaction Isolation Level y por supuesto a DataSnap

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.