Невозможно подключить распределенную транзакцию после перезапуска базы данных
Привет у меня есть проблема с подключить к распределенной транзакции после перезапуска базы данных.
Моя среда:
- 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 должно исправить это.