Apache Ignite容器托管事务支持与多节点缓存写入异常咨询
问题1:Apache Ignite是否默认支持参与容器管理事务
Apache Ignite 默认不支持 自动参与容器管理事务。Ignite自身实现了独立的事务处理模型,默认未与Java EE/Spring生态的容器事务上下文做自动绑定,如需让Ignite操作参与容器全局事务,需要显式配置JTA事务集成,将Ignite事务管理器注册到容器的JTA事务协调器中,同时开启缓存的事务同步配置。
问题2:多节点场景下异常的诱因
该异常的核心原因是跨节点执行的CacheStore逻辑未绑定容器事务与EntityManager上下文,具体逻辑如下:
- 单节点运行时,所有缓存操作的处理逻辑都在发起请求的业务线程上执行,该线程已经绑定了Spring注入的EntityManager和容器事务上下文,所以调用
em.merge可以正常执行,缓存落库均正常。 - 当第二个节点加入集群后,Ignite会根据缓存键的亲和性规则,将不同主键的分片分配到不同节点作为主分片。此时你调用缓存写入接口时,若对应主键的主分片落在第二个节点,CacheStore的
write方法会在第二个节点的Ignite内置工作线程上执行,该线程不存在业务侧的Spring容器事务上下文,也没有绑定可用的EntityManager实例,因此触发TransactionRequiredException异常。 - 你观测到缓存读取、直接调用EntityManager读取正常的原因是:Ignite缓存层的写入操作本身已经执行成功,只有CacheStore落库的步骤失败触发了事务回滚,读取时命中了缓存中的已写入数据;而你直接调用EntityManager的操作是在业务线程上执行,本身持有事务上下文因此可以正常运行。
内容的提问来源于stack exchange,提问作者user3474840
相关产品推荐
相关产品推荐

