2015-02-10 12 views
0

Сегодня меня поразил успешный 2pc, который не был реализован в Oracle. Другим участником был MSMQ, который материализовался хорошо.Oracle DML с фиксацией 2 фазы не материализовался

Проблема в том, что я не получил исключение в приложении (используя C# odp.net). Позже я нашел транзакции с сомнением в sys.dba_2pc_pending.

Мог ли я как-то обнаружить это в своем приложении?

EDIT: Речь идет не о том, чтобы работать 2pc. Он работает и более года до дня, когда некоторые строки отсутствуют. Пожалуйста, ознакомьтесь с информацией о транзакциях с внутренним сомнением link1 и ожидающими заключения сделок link2

+1

Возможно, вы можете показать нам код обработки исключений .. и вы должны убедиться, что он фактически обрабатывает другие ошибки ORA. Существует класс OracleException. –

+0

На самом деле нет обработки исключений, поэтому ошибка не может быть проглочена. Также другой участник (MSMQ) совершил штраф.Логика работает внутри обработчика Nservicebus. – Stig

+0

Можете ли вы разместить образец кода. Я предполагаю, что вы используете system.transaction? –

ответ

0

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

В моем случае ошибки не было. Мы используем RAC, и у службы не было распределенной обработки транзакций. В автономной системе я не уверен, что это будет делать, но в случае RAC она служит для идентификации первичного узла для обработки транзакции. Без этого вторая операция, которая должна была быть в одной операции, только закончилась тем, что начала новую транзакцию и зашла в тупик с первой.

У меня также было значительное количество времени без проблем. К счастью (вероятно, больше), так получилось, что транзакции никогда не расщеплялись по узлам. Но затем через год те же самые симптомы нарастают, и во всех случаях либо у службы не был установлен флаг DTP, либо использовалось неправильное имя службы (без DTP).

От: http://docs.oracle.com/cd/B19306_01/rac.102/b14197/hafeats.htm#BABBBCFG

Включение распределенной обработки транзакций для служб Для услуг , которые вы собираетесь использовать для распределенной обработки транзакций, создания службы с помощью Enterprise Manager, DBCA или SRVCTL и определяют только один экземпляр как предпочтительный экземпляр. У вас может быть как много доступных экземпляров, как вы хотите. Например, следующая команда SRVCTL создает службу одноплодной для базы данных, CRM xa_01.service.us.oracle.com, чей предпочтительный экземпляр RAC01:

srvctl добавить службы -d -s xa_01.service.us CRM .oracle.com -r RAC01 -a RAC02, RAC03

Затем отметьте услугу для распределенной транзакции , установив параметр DTP в значение ИСТИНА; по умолчанию FALSE. Enterprise Manager позволяет установить этот параметр на странице «Управляемые службы баз данных: создать сервис или изменить страницу службы». Вы также можете использовать пакет DBMS_SERVICE изменить DTP свойство из службы одноплодной следующим образом:

ВЫПОЛНИТЬ DBMS_SERVICE.MODIFY_SERVICE (service_name => 'xa_01.service.us.oracle.com', DTP => ИСТИНА);

+0

Если не включено, вы получите Исключение. – Stig

+0

Как и в случае неудачного завершения, мы здесь:. Я подробно остановился на своем ответе. –

+0

Я добавил соответствующую документацию о оракуле. –