我们有一个 C# 系统抛出了一个我们无法用 SQL (SQL2k5) 深入了解的奇怪现象。
情况是我们有两个独立的进程同时运行,查看同一个表,它们都在两个不同集群上的两个不同服务 COM+ 组件中运行在自己的事务中。Order
两者都在与OrderItem
SQL 表交谈。两者都在READ COMMITTED
隔离级别运行。
工作 1:将一个订单和一个或多个项目加载到这些表中。
作业 2:每隔几分钟发生的计划任务,从所述表中选择所有已完全处理的订单。
问题:我们发现,在过去的八个月中,工作 2 有四次对来自工作 1 的部分加载的订单做出反应,而工作 1 尚未完全完成(因为订单上的一个项目没有库存,它在完成状态,因此作业会看到订单的其余部分尚未加载)。
根据调查,虽然工作 1 正在进行中,但我们无法做到:
从订单中选择 *
一旦订单被插入其中。但是,我们可以这样做:
select * fromOrder o inner join OrderItem oi on oi.orderid = o.id
同时(这是为什么?)。
在复制相同情况的调查中,我们无法让工作 2 看到来自工作 1 的部分创建的订单,它确实返回了一些行,但从不返回工作 1 插入的订单。然而,这正是我们生活环境中发生的事情!
有谁知道为什么会发生这种情况?