假设我们有一个businessLogic()方法可以完成两件事:在本地缓存中写入一些信息,并使用JDBC将相同的信息保存在数据库中,以便缓存和数据库的内容始终相同。

我知道我们可以使用Spring的JDBC数据源事务管理器在发生异常的情况下自动回滚数据库。但是,在这种情况下,我们如何定义一个自定义事务管理器,该管理器还回滚缓存的内容,以使缓存的内容与数据库始终保持同步?

谢谢大家

最佳答案

Gab的答案是正确的,除了不正确的部分。

XA确实是协调多种资源更新的标准方法...除了缓存是本地的(即进程内)外,它不一定是资源。

缓存并非完全“实现JTA”,而是根据XA协议的部署方式充当XA协议中的两个角色之一。它可以是XAResource,但是通常仅在其生命周期不同于客户端进程的生命周期时才需要。对于进程内使用,它更可能是同步。

这些角色之间的主要区别是:XAResource是容错的,但是同步不是。对于客户端进程内存中的易失性缓存,在崩溃后通过查询数据库来重建缓存就足够了。对于未处理的高速缓存,在db tx提交之后但在高速缓存更新之前,客户端崩溃会使高速缓存不同步,至少直到它过期或被手动刷新为止。

根据缓存的实现,不能保证它将自动选择正确的模式。请参阅配置参考以了解您选择的实现方式,例如https://infinispan.org/docs/stable/user_guide/user_guide.html#tx_sync_enlist

尽管Spring确实提供了一个抽象层,但Spring实际上也不是JTA XA事务管理器。可以使用Spring在非XA模式下驱动数据库,但是这样就没有用于缓存同步的标准钩子,而是需要一个专有接口。或者,您可以让数据库通过一阶段资源适配器执行伪XA。对于您的用例而言,完整的2PC可能会过大。

关于java - 我们可以编写自定义的Spring事务管理器吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57569834/

10-12 02:50