|
Pregunta: Existe alguna opcion en Evolution para evitar que se inicie una TRANSACCION (Begin Transaction y Commit Transaction) al momento de enviar a AUTORIZACION una ENTIDAD? Importancia: Alta y Urgente Documentacion del Caso: Donde un cliente necesitamos ejecutar un procedimiento almacenado que esta creado en ORACLE, por lo que hemos podido revisar ORACLE automaticamente inicia una transaccion y considero que esa es la razon por la cual nos genera el siguiente error:
O si tienen alguna sugerencia para solventar este incidente favor de hacermelo saber. |
|
Gracias por sus respuestas, Las opciones de JOB y/o Alertas o Ejecucion de Procedimiento Almacenado ya las habia considerado anteriormente, más sin embargo no me he decidido por ellas porque el Proceso a ejecutar necesita actualizar datos del lado del ORACLE, que a su vez retornara un estatus de proceso satisfactorio o no, por tal razón lo necesitamos en vivo. Si fallase dicho proceso del lado del oracle, pues no procedería para este caso la contratación del lado de Evolution. Si como me indican no es posible evitar la transaccion interna que genera Evolution, pues buscaremos alternativas como por ejemplo consumo WEB Service. Saludos. Podes utilizar CLR y generar dlls para consumir Web Service desde la base de datos, si necesitas documentación te la puedo pasar. La opción con CLR es cómoda, pero se necesita habilitar el SQL Server para se puedan ejecutar. Si la llamada no es muy compleja, se puede con T-SQL usando un método que sobrevive desde las versiones antiguas de SQL Server. https://stackoverflow.com/questions/33449/can-you-call-a-webservice-from-tsql-code Otra manera es con un 'Web Service Task' de 'SQL Integration Services' https://docs.microsoft.com/en-us/sql/integration-services/control-flow/web-service-task |
|
Lamentablemente, no es posible eliminar la transacción del código fuente, ya que esta transacción garantiza la atomicidad de todas las operaciones a realizar; las cuales involucran el código que se ejecuta en el fuente, el procedimiento de antes y despues de la finalización, la generación de la bitácora y la notificación del resutado. Veo que la causa del problema es que el procedimiento de finalización Las transacciones distribuidas entre bases de datos diferentes (de cualquier marca), como la que estás queriendo hacer, son complicadas y requieren trabajo de configuración a nivel de servidores y servicios, y una redacción especial de los querys, del lado de SQL Server y de Oracle. Esto también ocurre si se trata de escribir en otra base SQL Server (conectada con un Linked Server) Te dejo algunos links, donde se habla de este problema: Scripting a distributed transaction on SQL Oracle Transactions Support with MS DTC Using Microsoft Transaction Server with Oracle Database BEGIN DISTRIBUTED TRANSACTION (Transact-SQL) Toda esta documentación es compleja de aplicar y pudiera requerir mucha inversión en tiempo y esfuerzo. Por lo que mi sugerencia es que envíen la información a Oracle, de una manera diferente. De manera asincrónica, para evitar que la llamada a Oracle se haga desde el procedimiento de finalización. Para ello podes explorar muchas técnicas, por ejemplo:
También, es aconsejable eliminar las transacciones de los procedimentos de base, de tal manera que quede únicamente la transacción del código fuente, para que sea más facil llegar a la configuración correcta entre los servidores. Primero, porque la atomicidad de la transacción es garantizada por la infraestructura del MTS y del DTC. En segundo lugar, porque siempre es posible redactar el proceso validando las operaciones antes de realizarlas, para retornar los errores al código fuente de Evolution y que sea él quien cancele la transacción global. |
|
Intenta configurar el DTC de manera idéntica en ambos lados y configurar en el linked server: Enable Promotion of Distributed Transactions: True. Si no funciona, eso que te digo, como lo dijo Fernando, podes crear un Job sin schedule, y ejecutarlo a través de un procedimiento almancenado. ESTE ES UN EJEMPLO:
|