我有一个 WCF 服务,它使用ODP.NET从 Oracle 数据库中读取数据。该服务也写入数据库,但间接地,因为所有更新和插入都是通过我通过 COM+ 访问的旧业务逻辑层实现的,我将其包装在TransactionScope中。旧层通过 ODBC 而不是 ODP.NET 连接到 Oracle。
我遇到的问题是,因为 Oracle 使用两阶段提交,并且由于较旧的业务层使用的是 ODBC 而不是 ODP.NET,所以事务有时会TransactionScope.Commit()
在数据实际可用于从服务层读取之前返回。
我在 Stack Overflow 上看到了一个类似的帖子,关于一个 Java 用户遇到这样的问题。
Oracle 的一位代表发帖称,我对这个问题无能为力:
这可能是由于 OLETx ITransaction::Commit() 方法的行为方式。在 2PC 的第 1 阶段(即准备阶段)之后,如果一切成功, 即使资源管理器实际上还没有提交,提交也可以返回. 毕竟,成功的“准备”是保证资源管理器在此之后不能任意中止。因此,即使资源管理器因为没有收到来自 MSDTC 的“提交”通知(由于通信失败)而无法提交,组件的提交请求也会成功返回。如果您立即从表中选择行,您有时可能会在执行选择后看到实际提交发生在数据库中。因此,由于一致的读取语义,您的选择将不会看到新行。在 Oracle 中我们对此无能为力,因为“在第 1 阶段成功后提交成功”优化是 MSDTC 实施的一部分。
所以,我的问题是:
我应该如何处理可能的延迟(通过标题“asyc”)的问题,以确定 2PC 的第二部分何时实际发生,所以我可以确定我插入(间接)的数据实际上可以被选择Commit()
通话返回后?
大型系统如何处理数据可能无法立即读取的事实?