【发布时间】:2020-03-06 20:11:31
【问题描述】:
我试图了解如何正确调用javax.transaction.xa.XAResource.recovery(int) 方法。我正在处理手动调用 XA 操作的环境,并且没有容器资源管理器。
JavaDocs 只是说可能有 TMSTARTRSCAN、TMENDRSCAN 和 TMNOFLAGS 的标志值,但没有解释使用任何这些标志或其组合时会发生什么。
我已经梳理了 Glassfish 代码以了解他们可能对标志值所做的事情,但没有发现任何有用的东西。我看过 Artemis - 只有在使用单独的 TMSTARTRSCAN 标志时,它才会返回所有不完整的事务。 Postgres JDBC 几乎是一样的,除了TMSTARTRSCAN 可以和TMENDRSCAN 耦合,所有的东西都是一次调用返回的。
我认为这些标志存在的原因是为了对结果进行某种分页,以防有太多未完成的交易。所以,处理这个问题的正确方法是:
- 拨打
recover()和TMSTARTRSCAN - 用
TMNOFLAGS调用recover(),直到结果数组为空 - 致电
recover()和TMENDRSCAN
对于上述所有调用,请准备好处理返回的 XID 值。
但我很想有人指出或解释它是如何运作的。
更新
@kayaman 优雅地向我指出 X/Open 的 XA 规范,我可以看到我的假设可能是正确的。该标准更清楚地解释了预期的行为,但由于数组大小预期的差异,它并不一对一地应用于 Java 实现。标准解释了什么时候不调用recover(TMENDRSCAN),但在Java的情况下并不清楚,也不清楚调用不正确是否会导致异常。
【问题讨论】:
-
总是有Specification。