Spring Kafka 事务提交顺序

Spring Kafka transaction commit sequence

我有两个服务。用户调用 Service-A 的 REST 端点,该端点进行处理,在数据库中创建 record/entry,然后发送 Kafka 事件以便可以使用 Service-B。

我已经用@Transactional 注释了,这样数据库提交和Kafka 提交是同时发生的。

Service-B 将接收 Kafka 事件,处理并将更新后的事件发送回 Service-A。

在这种情况下,我看到某些更新在 Service-A 中失败,表明未找到 record/entry。这是竞争条件吗?

由于 ChainedKafkaTransactionManager 已弃用,我如何确保先提交数据库然后再提交 Kafka?

“对于producer发起的事务,有了事务同步,Kafka commit也会发生在DB之后。”来自加里·罗素

在我的场景中,由于事务不是由 Kafka 发起的,我该如何撤消提交?

@Transactional("dstm")
public void someMethod(String in) {
  Employee employee = this.repository.save(new Employee(in));
  if(employee.isSomeCondition()) {
    sendToKafka(employee);
  }
}

实际上,这里有一个很好的示例,说明如何在多个数据源上配置事务处理:https://docs.spring.io/spring-kafka/docs/current/reference/html/#ex-jdbc-sync

另一个可能导致该问题的问题是您的使用者的隔离级别。你把它改成read_committed了吗?