Ir al contenido



Foto

Se pueden tener 2 transacciones iguales?


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

#1 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 433 mensajes

Escrito 23 abril 2015 - 06:17

El siguiente codigo inicia una transaccion de insertar un ticket, pero si tengo 10 sucursales insertando tickets, este codigo insertaria de a 1? o me equivoco?


delphi
  1. procedure TServerMethods1.nuevoticket(numero,ids,idcliente:integer;importe,efectivo,vuelto:Double;fechae,horae:string);
  2. var
  3. tr:TDBXTransaction;
  4. begin
  5. if (SUCURSAL.InTransaction) then
  6. raise Exception.Create('Hay una transacción pendiente');
  7. SUCURSAL.Open;
  8. try
  9. try
  10. tr:=SUCURSAL.BeginTransaction();
  11.  
  12. begin
  13. with qticket do
  14. begin
  15. Close;
  16. ParamByName('numero').AsInteger:=numero;
  17. ParamByName('importe').AsFloat:=importe;
  18. ParamByName('fechae').AsString:=fechae;
  19. ParamByName('horae').AsString:=horae;
  20. ParamByName('idsucursal').AsInteger:=ids;
  21. ParamByName('idcliente').AsInteger:=idcliente;
  22. ParamByName('efectivo').AsFloat:=efectivo;
  23. ParamByName('vuelto').AsFloat:=vuelto;
  24. ExecSQL();
  25. end;
  26.  
  27. SUCURSAL.CommitFreeAndNil(tr);
  28. end;
  29.  
  30. except
  31. SUCURSAL.RollbackFreeAndNil(tr);
  32. end;
  33. finally
  34. SUCURSAL.Close;
  35. end;
  36. end;


  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 abril 2015 - 10:59

Suponiendo que es un método que tienes en el server, entonces si el ciclo de vida del TdsServerClass al que pertenece dicho método es Invocation o Session, entonces se creará una instancia de esa clase para cada cliente (sucursal) por lo tanto cada cliente iniciará su propia transacción, en cambio si el ciclo de vida es del tipo server, entonces si chocarían los pedidos a dicho método.

 

Saludos.


  • 0

#3 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 433 mensajes

Escrito 25 abril 2015 - 07:07

Suponiendo que es un método que tienes en el server, entonces si el ciclo de vida del TdsServerClass al que pertenece dicho método es Invocation o Session, entonces se creará una instancia de esa clase para cada cliente (sucursal) por lo tanto cada cliente iniciará su propia transacción, en cambio si el ciclo de vida es del tipo server, entonces si chocarían los pedidos a dicho método.

 

Saludos.

Pues no he utilizado ese componente, simplemente uso una variable que luego asigno:


delphi
  1. a:TServerMethods1Client;
  2. a:=TServerMethods1Client.Create(ClientModule1.SQLConnection1.DBXConnection);
  3. a.nuevoticket(parametros);

Debere cambiar todo? o de esta forma me permite varias instancias?


  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 25 abril 2015 - 11:23

 Estamos en el foro de DataSnap. Cual es la estructura de tu aplicación? Tienes una aplicación servidor? Tienes alguna aplicación Cliente? La clase TServerMethods1 asumo que hace parte de una aplicación Server de DataSnap, de ser así para que los métodos públicos declarados en esa clase sean visibles desde una aplicación cliente la clase TServerMethods1 debería ser expuesta por un TdsServerClass y es en esta en la que hay que mirar la propiedad LifeCycle de la que yo hablaba en mi post anterior.

 

Saludos.


  • 0

#5 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 433 mensajes

Escrito 25 abril 2015 - 12:51

 Estamos en el foro de DataSnap. Cual es la estructura de tu aplicación? Tienes una aplicación servidor? Tienes alguna aplicación Cliente? La clase TServerMethods1 asumo que hace parte de una aplicación Server de DataSnap, de ser así para que los métodos públicos declarados en esa clase sean visibles desde una aplicación cliente la clase TServerMethods1 debería ser expuesta por un TdsServerClass y es en esta en la que hay que mirar la propiedad LifeCycle de la que yo hablaba en mi post anterior.

 

Saludos.

De hecho es una aplicacion cliente servidor, lo que tengo en el cliente es un clientdatamodule con un Tsqlconnection, conozco el componenete tdsserverclass, pero no sabia que debia utilizarlo porque lo habia hecho como te mencione arriba. Pero no es problema, lo intentare y te comento.


  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 25 abril 2015 - 03:46

De hecho es una aplicacion cliente servidor, lo que tengo en el cliente es un clientdatamodule con un Tsqlconnection, conozco el componenete tdsserverclass, pero no sabia que debia utilizarlo porque lo habia hecho como te mencione arriba. Pero no es problema, lo intentare y te comento.

 

Pienso que ya lo debes tener en el container del server de lo contrario no  podrías ni ver ni  ejecutar en el cliente los métodos expuestos por el servidor.

 

Saludos.


  • 0

#7 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 433 mensajes

Escrito 01 mayo 2015 - 04:59

Pienso que ya lo debes tener en el container del server de lo contrario no  podrías ni ver ni  ejecutar en el cliente los métodos expuestos por el servidor.

 

Saludos.

Si de hechi abri mi servidor y me fije lo que dices y estaba en Session. Y como se que no va a colapsar el servidor? Debo calcularlo mas o menos antes?


  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 01 mayo 2015 - 07:55

Si el ciclo de vida del TDSServerClass es session, entonces se creará una instancia de la clase por cada cliente conectado al servidor, por ende cada cliente que invoque el método iniciará una transacción diferente sin  importar que coincidan en un mismo momento, no hay ningún problema ya que cada una ocupa  un espacio de memoria diferente en el server, si se diera este caso quien resuelve la concurrencia es el motor de la DB, que ese sabe muy bien cómo hacerlo.

 

Es muy fácil probarlo, colocá en el form cliente desde donde llamás el método un TTimer y ponele la propiedad enabled en false y el interval en 100,  arrastrá también un TDateTimePicker y ponele la propiedad kind en Time.

Luego en el evento OnTimer del Timer poné esto:


delphi
  1. if DateTimePicker1.DateTime < now then
  2. begin
  3. Timer1.Enabled := false;
  4. // ejecutar tu método;
  5. end;

Agregá un botón para activar el Timer : Timer1. Enabled := true.

 

Compilá la aplicación y arrancá 3 o 4 instancias del cliente, hacé esto por fuera del IDE, o sea desde el ejecutable de la aplicación cliente, llená en cada instancia los datos que vas a grabar colocá en el DateTimePicker de cada instancia una hora prudencial (la hora del sistema mas 2 minutos o la que te de tiempo) eso si que sea la misma en todos para que los métodos se ejecuten a la misma hora, luego activa los Timers en cada instancia, esto hará que a la hora que pusiite en los Timers cada cliente ejecutará el método, luego comprobarás  que se insertaron tantos registros nuevos como clientes hayas ejecutado.

 

Saludos.


  • 0

#9 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 433 mensajes

Escrito 01 mayo 2015 - 09:49

A lo que me referia es a la capacidad de hardware del servidor...como se que no se va a agotar o hasta cuanto puedo ahcer, pienso que esto se ve a ojo... Habria que buscar la manera de limitar los pedidos al server. muchas gracias


  • 0

#10 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 01 mayo 2015 - 10:29

A lo que me referia es a la capacidad de hardware del servidor...como se que no se va a agotar o hasta cuanto puedo ahcer, pienso que esto se ve a ojo... Habria que buscar la manera de limitar los pedidos al server. muchas gracias

 

Haz la prueba que te digo, ejecuta unos 10 clientes, entonces con el administrador de tareas de Windows miras el consumo de CPU y de memoria de la apliacaión Server.

Si buscas en los ejemplos de DataSnap que proporciona Embarcadero, por allí hay uno de Andreano Lanuse que muestra como monitorear el consumo de recursos del Server.

 

Lo de limitar los pedidos al Server tocaría hacerlo en caso de que tengas mas de 50 usuarios concurrentes, unos procesos muy complejos, y una máquina muy pobre alojando el server.


  • 0