sql >> Base de Datos >  >> RDS >> Oracle

EF y TransactionScope para SQL Server y Oracle sin escalar/ampliar a DTC?

Primero:nunca use var ts = new TransactionScope() . Es el único trazador de líneas que mata su aplicación. Utilice siempre el constructor explícito que le permita especificar el nivel de aislamiento. Consulte el uso de la nueva TransactionScope() considerada dañina.

Ahora sobre su pregunta:la lógica de no promover dos conexiones en el mismo ámbito en DTC depende en gran medida de que el controlador/proveedores cooperen para informar a System.Transactions que las dos conexiones distintas son capaces de administrar la transacción distribuida sin problemas por sí mismas porque los administradores de recursos involucrados es el mismo. SqlClient post SQL Server 2008 es un controlador que es capaz de hacer esta lógica. El controlador de Oracle que usa no lo es (y no conozco ninguna versión que lo sea, por cierto).

En última instancia, es muy, muy, muy básico:si no desea un DTC, ¡no cree uno! Asegúrese de utilizar exactamente una conexión en el alcance. Es claramente discutible que no necesita dos conexiones. En otras palabras, deshágase de los dos repositorios separados en su modelo de datos. Use solo un repositorio para pedidos, inventario y otras cosas. Te estás disparando en el pie con ellos y estás pidiendo soluciones de polvo de hadas.

Actualización:controlador Oracle 12c r1:

"Asociación de transacciones y conexiones:las conexiones ODP.NET, de forma predeterminada, se separan de las transacciones solo cuando se cierran los objetos de conexión o se eliminan los objetos de transacción"