FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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); ¿Cual sería la manera correcta de manejar las transacciones? |
#2
|
||||
|
||||
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. |
#3
|
|||
|
|||
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! |
#4
|
||||
|
||||
__________________
El malabarista. |
#5
|
||||
|
||||
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)
|
#6
|
||||
|
||||
Corrección clara!
__________________
El malabarista. |
|
|
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 |
|