Transacciones simultaneas con DI API

Buen día expertos, estoy trabajando en una aplicación web con lenguaje asp.net para crear cotizaciones.
Realizando las pruebas finales antes de enviarla a producción me percaté que hay un problema cuando dos usuarios quieren crear un documento exactamente al mismo tiempo.

Si inicio una transacción y espero a que finalice para inmediatamente empezar una nueva no pasa nada, se crean ambos documentos sin problema; pero si en el transcurso de que la primera transacción está siendo procesada inicio una segunda paralelamente, ahi es cuando viene el problema: las páginas de ambos usuarios se quedan cargando indefinidamente y se inhiben varias tablas de la base de datos (supongo que para evitar datos corruptos o algo similar).

Estoy consciente de que el DI API no soporta multi-hilo, y que se debe hacer una transacción a la vez, quería consultar con ustedes si saben alguna forma de hacer una especie de “fila de espera” para que la segunda transacción aguarde hasta que la que se está ejecutando concluya correctamente.

Actualmente la forma en la que creo el documento es la siguiente:

int iret = Cotizacion.Add();

//Revisar si se creó el documento
if (iret == 0)
{
    docEntry = oCompany.GetNewObjectKey();

    if (oCompany.InTransaction)
        oCompany.EndTransaction(BoWfTransOpt.wf_Commit);

    if (oCompany.Connected)
        oCompany.Disconnect();

    System.Runtime.InteropServices.Marshal.ReleaseComObject(Cotizacion);

    ShowMessage("Se creó con éxito la cotización");
    con.Close();
}
else
{
    int errNum; string errMsj;
    oCompany.GetLastError(out errNum, out errMsj);

    if (oCompany.InTransaction)
        oCompany.EndTransaction(BoWfTransOpt.wf_RollBack);

    string error = "Error al crear la cotización: " + errMsj + " | Código: " + errNum.ToString();
    ShowMessage(error, MessageType.Error);
}

Agradezco de antemano cualquier apoyo, ejemplo u orientación que puedan brindarme. Saludos cordiales.

1 me gusta

Te recomiendo mucho que para trabajar con este tipo de aplicaciones lo hagas con DI SERVER.

2 Me gusta

Buen día @juliancab, nunca he trabajado con DI SERVER, el usar esa herramienta evitaría el problema que se está presentando?

1 me gusta

Te da mas opciones para solucionarlo, por ejemplo puedes ir creando archivos (xml) de tus transacciones e ir procesando poco a poco (puedes incluir un monitor de trans), he visto varias app que trabajen de ese modo y creeme son muy funcionales.

2 Me gusta

@chavalito no me dejes desamparado tu te has topado con esta problematica?

1 me gusta

Bueno al final hice lo mencionado en el siguiente hilo de un foro de SAP:

h_tps://archive.sap.com/discussions/thread/2109410

Removí lo siguiente de mi código y problema solucionado:

oCompany.StartTransaction()

oCompany.EndTransaction(BoWfTransOpt.wf_Commit)

Según el post citado, las funciones de start/end transaction están destinadas a cantidades grandes de procesos y no a hilos individuales como lo es la app con la que trabajo. Lo dejo por si a alguien le llega a servir en un futuro. Saludos cordiales.

2 Me gusta