我知道我们可以使用 Spring 的JDBC数据源事务管理器在出现异常时自动回滚数据库。但是,在这种情况下,我们如何定义一个自定义的事务管理器,它也回滚缓存的内容,以便缓存和 DB 的内容始终保持同步?
谢谢大家。
心有法竹
浏览 134回答 3
3回答
慕尼黑的夜晚无繁华
Gab 的回答是正确的,除了不正确的部分。XA 确实是协调多个资源更新的标准方法...除了缓存是本地的,即进程内缓存,它不一定是资源。缓存并不完全“实现 JTA”,它根据其部署方式充当 XA 协议中的两个角色之一。它可以是 XAResource,但通常只有在其生命周期不同于客户端进程的情况下才需要。对于进程内使用,它更有可能是同步。这些角色之间的主要区别在于:XAResource 是容错的,但 Synchronization 不是。对于客户端进程内存中的易失性缓存,在崩溃后通过查询数据库重建缓存就足够了。对于进程外的缓存,客户端在 db tx 提交之后但在缓存更新之前崩溃将使缓存不同步,至少直到它过期或被手动刷新。根据缓存实现,不能保证它会自动选择正确的模式。Spring 实际上也不是 JTA XA 事务管理器,尽管它确实在它们之上提供了一个抽象层。可以使用 Spring 在非 XA 模式下驱动数据库,但是你没有用于缓存同步的标准挂钩,你需要一个专有接口。或者您可以让数据库通过单阶段资源适配器执行伪 XA。Full-on 2PC 对于您的用例来说可能有点矫枉过正。