11.2.10. XA 恢复过程的限制
XA 恢复有以下限制:
可能无法从成功提交的事务中清除事务日志。
如果 JBoss EAP 服务器在
XAResource
提交方法后崩溃并提交事务,但在协调员更新日志之前,您可能会在重启服务器时在日志中看到以下警告消息:ARJUNA016037: Could not find new XAResource to use for recovering non-serializable XAResource XAResourceRecord
这是因为在恢复时,JBoss 事务管理器(TM)会在日志中看到事务参与者并尝试重试提交。最终,JBoss TM 假设资源已提交,不再重试提交。在这种情况下,您可以在提交事务时安全地忽略此警告,而且不会丢失数据。
要防止警告,请将
com.arjuna.ats.jta.xaAssumeRecoveryComplete 属性
值设置为true
。当新的XAResource 实例无法来自任何注册的
当设置为XAResource
Recovery 实例时,就会检查此属性。true
时,恢复假设上一提交尝试成功,并且可以在不进一步恢复尝试的情况下从日志中移除实例。此属性必须谨慎使用,因为它是全局的,使用不正确时可能会导致XAResource
实例处于未提交状态。注意JBoss EAP 7.3 实施了增强功能,可在成功提交事务后清除事务日志,以上情况不应频繁发生。
当服务器在
XAResource.prepare()
结束时崩溃时,不会在 JTS 事务中调用回滚。如果 JBoss EAP 服务器在完成
XAResource.prepare()
方法调用后崩溃,则所有参与的XAResource
实例都会处于就绪状态,并在服务器重启后保持这种方式。事务不会被回滚,资源在事务超时或数据库管理员手动回滚资源并清除事务日志前保持锁定。如需更多信息,请参阅 https://issues.jboss.org/browse/JBTM-2124对已提交的事务可进行定期恢复。
当服务器负载过量时,服务器日志可能包含以下警告信息,后跟一个 stacktrace:
ARJUNA016027: Local XARecoveryModule.xaRecovery got XA exception XAException.XAER_NOTA: javax.transaction.xa.XAException
在负载过重时,交易所花费的处理时间可能与定期恢复过程的活动时间重叠。定期恢复过程检测到仍在进行中的事务,并尝试启动回滚,但实际交易将继续完成。在定期恢复尝试但回滚失败时,它会在服务器日志中记录回滚失败。以后的发行版本中会解决此问题的根本原因,但目前可以使用一个临时解决方案。
通过将
com.arjuna.ats.jta.orphanSafetyInterval
属性设置为大于默认值10000
毫秒,以增大恢复过程的两个阶段之间的间隔。建议值为40000
毫秒。请注意,这不会解决这个问题。相反,它会降低发生该信号的可能性,并在日志中显示警告消息。如需更多信息,请参阅 https://developer.jboss.org/thread/266729