Manejo de transacciones B.D. En WebService

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:

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, el problema es que si el servicio es invocado más de una vez al mismo tiempo, las transacciones se mezclan porque todas las invocaciones utilizan la misma conexión.

¿Cuál sería la manera correcta de manejar las transacciones?

Respuesta
1

Antes que nada recibe un cordial saludo, por otro lado gracias por darme tu confianza, finalmente, mi sugerencia es que construyas un stored procedure en SQL y ahí coloques la transacción, así podrás dejar la administración de las mismas directamente al RDBMS.

Por el momento lo resolví de la siguiente forma:
En el WebModule declaro una variable en threadvar del tipo TwsDataModule.
Luego en el evento BeforeDispatch instancio esta variable con mi dataModule (TwsDataModule) que tiene las conexiones.
Posteriormente en el evento AfterDispatch realizo un freeAndNil de esta variable.
De esta forma logro que por cada invocación a mi W.S., se cree un dataModule con las conexiones que utilizarán en esa petición, y cada conexión puede tener una transacción distinta.

Antes que nada recibe un cordial saludo, me da un enorme gusto que hayas logrado resolver tu problema, pero no olvides mi recomendación, ya que desde el punto de vista técnico y aunque delphi te permite definir transacciones, lo correcto es que quien realice estás actividades sea el RDBMS, ya que esa es una de sus potencialidades y tu webservice, sólo debería de exponer los métodos y enviar la información necesaria, pero la capa de backend debe estrictamente funcionar en SQL.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas