我想到了一个理论上看起来对我来说可能的情景,但我在网上找不到任何信息。
技术环境是使用Spring的Java,但我对其他选择持开放态度。
我有一个使用@Transactional包装数据库事务的服务(ServiceA)。作为逻辑的一部分,它需要调用远程服务(例如,让我们假设REST,但SOAP或其他也可能适用)。此类服务(ServiceB)也使用@Transactional本身进行交易。
显然,可能存在一致性问题:例如,ServiceB可能在远程调用后COMMIT和ServiceA可能失败,因此ROLLBACK ......但ServiceB不是ROLLBACK。明显。
XA救援。理论上。 ServiceA可以启动XA分布式事务,ServiceB注册相同的XA分布式事务,当ServiceA结束时,它可以对ServiceB(及其DB)和自己的DB进行两阶段提交。但是......我还没有找到这个设置的例子。我可以找到的每个分布式XA事务示例都使用同一服务中使用的两个DB(通常是一个SQL JDBC数据库和一个JMS)。
我是否有任何理论上的误解会导致此场景无法撤销?或者我在搜索Google时犯了错误?有这样的例子吗?
感谢。
PS:我了解其他解决方案,例如最终的一致性,但这不是我要问的。