Oracle DML с двухфазной фиксацией не реализован
Сегодня я был поражен успешным 2pc, который не материализовался в Oracle. Другой участник был MSMQ, который материализовался хорошо.
Проблема в том, что я не получил исключение в приложении (используя C# odp.net). Позже я нашел транзакции под сомнением в sys.dba_2pc_pending.
Мог ли я как-то обнаружить это в моем приложении?
РЕДАКТИРОВАТЬ: Это не о том, чтобы заставить 2pc работать. Это работает, и в течение более года до дня, когда некоторые строки пропали без вести. Пожалуйста, ознакомьтесь с информацией о транзакциях Oracle In-Doubt link1 и ссылке ожидающих транзакций2
1 ответ
Сначала я хочу убедиться, что на слушателе оракула включена обработка распределенных транзакций.
В моем случае ошибки не было. Мы используем RAC, и для службы не была включена распределенная обработка транзакций. В автономной системе я не уверен, что это будет делать, но в случае RAC это служит для определения основного узла для обработки транзакции. Без этого вторая операция, которая должна была находиться в той же операции, просто заканчивала запуск новой транзакции и блокировалась с первой.
У меня также было значительное количество времени без проблем. По счастливой случайности (возможно, есть и другие), так получилось, что транзакции никогда не разделялись на узлы. Но затем, год спустя, появились те же симптомы, и во всех случаях либо у службы не был установлен флаг DTP, либо использовалось неправильное имя службы (без DTP).
От: http://docs.oracle.com/cd/B19306_01/rac.102/b14197/hafeats.htm
Включение обработки распределенных транзакций для служб Для служб, которые вы собираетесь использовать для обработки распределенных транзакций, создайте службу с помощью Enterprise Manager, DBCA или SRVCTL и определите только один экземпляр в качестве предпочтительного. Вы можете иметь столько ДОСТУПНЫХ экземпляров, сколько захотите. Например, следующая команда SRVCTL создает одноэлементную службу для базы данных crm xa_01.service.us.oracle.com, предпочтительный экземпляр которой - RAC01:
srvctl добавить службу -d crm -s xa_01.service.us.oracle.com -r RAC01 -a RAC02, RAC03
Затем пометьте службу для распределенной обработки транзакций, установив для параметра DTP значение ИСТИНА; по умолчанию FALSE. Enterprise Manager позволяет установить этот параметр на странице "Службы управляемых кластеров баз данных": "Создать службу" или "Изменить службу". Вы также можете использовать пакет DBMS_SERVICE для изменения свойства DTP службы singleton следующим образом:
EXECUTE DBMS_SERVICE.MODIFY_SERVICE (service_name => 'xa_01.service.us.oracle.com', DTP => TRUE);