This entry describes a solution for an exception occurred when trying to implement distributed transaction on Oracle Real Application Cluster database.
One of our partners got the following errors, while they were trying to test their .Net application on RAC.
Application Error / Event Log
System.Runtime.InteropServices.COMException (0x8004D00A): New
transaction cannot enlist in the specified transaction coordinator.
ORA-24798: cannot resume the distributed transaction branch on another instance
App. developed by Microsoft .Net
DB configured as a Oracle Real Application Cluster.(As well as there was no problem, when the partner created same workload on a single instance.)
They have 4 application server nodes and load balancing is active on app. side.
App. uses Microsoft Transaction Management Server
and OraOLEDB.Oracle provider calls distributed transactions.
For solution, I created more than one services then set preferred and
available instances for each service.
srvctl add service -d DB_UNIQUE_NAME -s SERVICE_NAME1 -r NODE1 -a NODE2
srvctl add service -d DB_UNIQUE_NAME -s SERVICE_NAME2 -r NODE2 -a NODE1
and fixed DTP => TRUE for these services.
execute dbms_service.modify_service (service_name => 'SERVICE_NAME1' ,dtp => true);
execute dbms_service.modify_service (service_name => 'SERVICE_NAME2' ,dtp => true);
We repeated to load same workload one more time using this service architecture and we did not get any error, it worked well!
Most of the errors caused by distributed transactions on RAC can be solved by this service settings.
Finally, very happily our solution has published as a support.oracle note to share with our partners and customers!
Article ID : 1443954.1 ORA-24798 Distributed Transaction Exception when Connecting to a RAC Instance from a Windows Application