Невозможно подключить распределенную транзакцию после перезапуска базы данных

Привет у меня есть проблема с подключить к распределенной транзакции после перезапуска базы данных.

Моя среда:

  • Windows 7 x64 с пакетом обновления 1
  • Oracle Database 11g Express Edition
  • ODP.NET 4.112.3.0

Моя программа:

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);
        }
    }
}

Все прекрасно работает после запуска приложения. Когда я начинаю останавливать базу данных, я получаю NRE и какое-то исключение, сообщающее, что происходит отключение базы данных. После запуска снова я получаю сообщение об ошибке - Невозможно подключиться к распределенной транзакции. Открытое соединение больше не печатается.

Выход:

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
...
  • В чем причина такого поведения?
  • Как диагностировать, что случилось?

1 ответ

Решение

У вас неверный тест. Вы зацикливаетесь в контексте одной транзакции. Когда база данных выходит из строя, любая выполняемая распределенная транзакция прерывается. Ваш цикл пытается установить новое соединение в рамках этой уже мертвой транзакции.

Я не уверен, что именно вы пытаетесь проверить, но перемещение TransactionScope внутри цикла while должно исправить это.

Другие вопросы по тегам