BizTalk WCF-OracleDB (post-)轮询(-可用)-语句

BizTalk WCF-OracleDB (post-)polling(-available)-statements

我有一个关于使用 WCF-OracleDB 适配器在事务内进行轮询的一般性问题,以确保轮询的一个(或多个)行也更新为仅轮询一次。

在 WCF-SQL 中,我通常使用轮询(可用)语句。在 PollingAvailableStatement 中,我使用了一个简单的 COUNT(*) 查询。在 PollingStatement 中,我通常查询下一行并将其 ID 存储在本地。然后我既查询数据又用状态更新行,以确保轮询的行永远不会再次被轮询。而且,如果出现问题,它会被 AmbientTransaction 回滚。

如何使用 PostPollingStatement 实现与 WCF-OracleDB-adapter 相同的功能?我想念的是 "reference" 我轮询的行,以确保只有正确的行获得更新状态。

我试过 google 这个,当然,但每个人似乎都避免这个要求...?

我无法在 Oracle 中找到任何功能组合来使用与 SQL 服务器具有更新轮询状态和 return 数据的过程相同的解决方案。因此,必须有另一种针对 Oracle 数据库的安全轮询的解决方案。

Oracle 有两种事务隔离级别模式,您需要使用Serializable 才能使轮询工作令人满意。我认为它就像你进入可序列化模式时得到的数据库的"snapshot"。如果您改为使用 ReadCommitted,您将与其他用户所做的更改隔离开来。当您提交时,其他用户会看到您的更改,您也会看到他们的更改。为避免其他用户在可序列化模式下进行干扰,请确保使用 FOR UPDATE 锁定行。它将在您(或 BizTalk)提交更改时发布。

最重要的是,在可序列化模式下,相同的查询将始终 return 相同的结果(如果您没有自己更改)。这就是您如何只更新您之前轮询的行,即我的问题中遗漏的 "reference"。

此外,必须使用 UseAmbientTransaction 来确保 BizTalk 在出现问题时成功回滚事务。使用一些人提议的 PRAGMA AUTONOMOUS_TRANSACTION 不是一种选择,因为它是一个子事务,不能由 BizTalk 启动的事务回滚。

Note: EnableBizTalkCompatibilityMode should also be set to True, but I have not found any explanation of why or what it does.

因此,通过上述设置,WCF-OracleDB 适配器将在执行 PollingStatement 之前自动进入可序列化模式,您将能够使用与 PollingStatement 相同的查询来接收数据和更新轮询状态,并且适配器将提交更改,如果PostPollingStatement 成功。如果没有,AmbientTransaction 会确保您的更改未提交。

并且,轮询语句的配置:

PollingAvailableStatement

SELECT COUNT(*) FROM <Table> WHERE POLLED = 0

轮询语句

SELECT * FROM <Table> WHERE POLLED = 0 ORDER BY Date ASC FOR UPDATE

投票后声明

 UPDATE <Table> SET POLLED = 1 WHERE POLLED = 0

在实际场景中,您可能还必须考虑批处理(在 Oracle 中使用 ROWNUM),这意味着您需要构建与此类似的查询:

SELECT * 
FROM <Table> 
WHERE PK IN 
(
    SELECT PK
    FROM (
        SELECT *
        FROM <Table>
        WHERE POLLED = 0
        ORDER BY PK ASC
     )
     WHERE ROWNUM <=10
)
FOR UPDATE;

和:

UPDATE <Table> 
SET POLLED = 1
WHERE PK IN 
(
    SELECT PK
    FROM (
        SELECT *
        FROM <Table>
        WHERE POLLED = 0
        ORDER BY PK ASC
     )
     WHERE ROWNUM <=10
)

这里的重点是必须先执行WHERE和ORDER BY,然后ROWNUM基于那个子查询(或视图)。