سؤال

Hi I have problem with enlist to distributed transaction after database restart.

My environment:

  • Windows 7 x64 with SP1
  • Oracle Database 11g Express Edition
  • ODP.NET 4.112.3.0

My program:

const string connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=LOCALHOST)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));User Id=system;Password=sasa;";

static void Main(string[] args)
{
    using (TransactionScope scope = new TransactionScope())
    {
        while (true)
        {
           using (OracleConnection connection = new OracleConnection(connectionString))
           {
               try
               {
                   connection.Open();
                   Console.WriteLine("Connection opened");
               }
               catch (Exception ex)
               {
                   Console.WriteLine(ex.Message);
               }
           }
           Thread.Sleep(1000);
        }
    }
}

All works great after application start. When I start stopping database I get NRE and some exception telling me that database shutdown is in progress. After start it again i'm receiving error - Unable to enlist in a distributed transaction. Connection opened is no longer printed.

Output:

Connection opened
Connection opened
Connection opened
Connection opened
Connection opened
-- here I'm stopping database
ORA-12518: TNS:listener could not hand off client connection
ORA-12528: TNS:listener: all appropriate instances are blocking new connections
-- here database is stopped I suppose
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
-- here I'm starting database again
ORA-12528: TNS:listener: all appropriate instances are blocking new connections
ORA-1033: ORACLE initialization or shutdown in progress
Unable to enlist in a distributed transaction
Unable to enlist in a distributed transaction
Unable to enlist in a distributed transaction
Unable to enlist in a distributed transaction
Unable to enlist in a distributed transaction
...
  • What is the reason of that behavior?
  • How to diagnose what's happen?
هل كانت مفيدة؟

المحلول

You have an invalid test. You are looping inside the context of a single transaction. When the database goes down any in-progress distributed transaction is aborted. Your loop is trying to bring up a new connection under that already-dead transaction.

I'm not sure exactly what you are trying to test but moving the TransactionScope inside of the while loop should fix it.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top