У меня есть служба WCF, которая использует ODP.NET для чтения данных из базы данных Oracle. Служба также записывает в базу данных, но косвенно, так как все обновления и вставки достигаются с помощью более старого уровня бизнес-логики, который я получаю через COM +, который я завершаю в TransactionScope. Более старый уровень подключается к Oracle через ODBC, а не ODP.NET.Что такое хороший способ справиться с «асинксом»?
У меня есть проблема в том, что, поскольку Oracle использует две фазы фиксации, и потому, что старший бизнес-слой с помощью ODBC и не ODP.NET, сделка иногда возвращается на TransactionScope.Commit()
до того, как данные действительно доступны для чтения из служебного уровня.
Я вижу a similar post about a Java user having trouble like this, а также на переполнение стека.
Представитель Oracle posted that there isn't much I can do about this проблемы:
Это может быть связано с тем, как OLETx ITransaction :: Commit() метод ведет себя. После того, как фаза 1 2PC (то есть фаза подготовки), если все успешно, фиксация может быть возвращена, даже если ресурсы менеджеров фактически не совершили. В конце концов, успешная «подготовка» - это гарантия того, что менеджеры ресурсов не могут произвольно прекратить после этого пункт. Таким образом, даже если менеджер ресурсов не мог совершить, потому что не получил «совершить» уведомление из MSDTC (из-за сбоя сказать в связи), запрос на совершение компонента возвращает успешно. Если вы выберете строки из таблицы, вы сразу можете увидеть , иногда видите, что фактическое совершение происходит в базе данных после того, как у вас уже есть . Ваш выбор будет , поэтому не вижу новых строк из-за последовательной семантики чтения. Существует . Мы ничего не можем с этим поделать в Oracle , поскольку «фиксация успеха после успешной фазы 1» - это часть реализации MSDTC.
Итак, мой вопрос заключается в следующем:
Как я должен идти о работе с возможной задержкой («asyc» по названию) проблемы выяснения, когда вторая часть 2PC на самом деле происходит, поэтому я могу быть уверен, что данные, которые я вставил (косвенно), действительно доступны для выбора после возврата вызова Commit()
?
Как большие системы справляются с тем, что данные могут быть не готовы к немедленному чтению?
Вы пробовали, что предложено в этой ссылке? Перемещение на odp.net 11.1.07.20 и Oracle 11. – tuinstoel
Хотел бы я просто обновить, но версия Oracle не в моем распоряжении. Бизнес-уровень еще не готов к 11 и не будет в ближайшее время. –