Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Delphi para la web
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-09-2016
andres_04_08 andres_04_08 is offline
Registrado
NULL
 
Registrado: ago 2016
Posts: 9
Poder: 0
andres_04_08 Va por buen camino
Manejo de transacciones B.D. en WebService

Buenas tardes.

Estoy desarrollando WebService REST ISAP en DelphiXE3 utilizando bases de datos SQL Server.

En el proceso del W.S., debo realizar varios pasos en una sola transacción y lo hago de la siguiente forma:

Código:
VAR
   lTransactionDesc: TDBXTransaction;
...

// ** Inicio Transacción ** //
if not wsDataModule.SQLConnectionServer.InTransaction then
begin
   wsDataModule.SQLConnectionServer.CloseDataSets;
   lTransactionDesc := wsDataModule.SQLConnectionServer.BeginTransaction(TDBXIsolations.ReadCommitted);
end;

//Acá van todas las operaciones que debo hacer en mi transacción

// ** Finalizo transacción ** //
if wsDataModule.SQLConnectionServer.InTransaction then
   wsDataModule.SQLConnectionServer.CommitFreeAndNil(lTransactionDesc);
La transacción la estoy creando sobre la conexión a mis datos (TSQLConnection), el problema es que si el servicio es invocado más de una vez al mismo tiempo, las transacciones se mezclan porque todas utilizan la misma conexión.

¿Cual sería la manera correcta de manejar las transacciones?
Responder Con Cita
  #2  
Antiguo 13-09-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Es porque no estas siguiendo el modelo "state-less" de la web, sino el "state-full". Osea, tienes una conexión que comparte todo el programa. En cambio, debes crear una conexión POR CADA* request que se haga.


* Si hay que soportar muchas conexiones al mismo tiempo, esto se vuelve un problema. Para ello, se necesita un pool de conexiones y un manejo que reparta esas conexiones. Con ADO es sencillo, pero no se que usas.


----

Un problema endemico de la programacion y que el modelo OO "tradicional" mal empleado amplifica es el manejo de estado global.

Todos saben que las variables globales son (generalmente) malas. Pues eso es lo que pasa aqui, y en todo momento donde las llamadas de un programa pueden alterar el estado interno de los componentes, en vez de que sean independientes de cada una.

Un DataModule es una vble global. Tener accesos concurrentes a una vble global es una conocida receta para el desastre y bugs dificiles de anticipar.
__________________
El malabarista.

Última edición por mamcx fecha: 13-09-2016 a las 21:00:50.
Responder Con Cita
  #3  
Antiguo 13-09-2016
andres_04_08 andres_04_08 is offline
Registrado
NULL
 
Registrado: ago 2016
Posts: 9
Poder: 0
andres_04_08 Va por buen camino
Muchas gracias por tu respuesta!, supuse que estaba sucediendo lo que indicas.

Estoy utilizando TSQLQuery conectados con TSQLConnection, ¿sabras decirme como manejar el pool de conexión con estos componentes? de lo contrario, podrás darme un ejemplo de como hacerlo con ADO.

Lo que se me ocurrió también, es instanciar un TSQLConnection en cada llamada al servicio, ¿puede ser esta la forma? ¿en que evento del WebModule se debería realizar?

Gracias!
Responder Con Cita
  #4  
Antiguo 14-09-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Buscando en google:

http://docwiki.embarcadero.com/RADSt...rs_tutorial%29
__________________
El malabarista.
Responder Con Cita
  #5  
Antiguo 14-09-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Un data module no es una variable global. Que el IDE te cree una variable global es otro tema. Lo mismo se podria decir de los form. Pero ese comportamiento se arregla fácilmente cambiando una opción para que no te cree nada automáticamente (no agrega las "líneas mágicas" en el dpr)
Responder Con Cita
  #6  
Antiguo 14-09-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Corrección clara!
__________________
El malabarista.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Manejo de transacciones StartKill MS SQL Server 7 23-09-2008 21:46:53
Manejo de transacciones en SQL server look SQL 6 21-08-2008 17:27:17
error en manejo de transacciones JODELSA Varios 1 11-07-2005 16:50:56
Manejo de Transacciones takeo Conexión con bases de datos 0 01-12-2004 05:29:53
Manejo de Transacciones senpiterno Conexión con bases de datos 1 08-10-2004 15:05:34


La franja horaria es GMT +2. Ahora son las 12:37:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi