在同一个方法里,有redis,数据库和api,如何保证方法的事务性或者最终一致性?

一个 Service 方法里有三个操作

doSomething{

数据库写操作

redis 写操作

调用某 api

}

如何实现这个方法的事务性,或者最终一致性?

如果仅有redis和数据库操作

@Transactional
doSomething{

数据库写操作
redis 写操作   

}
redis抛异常导致数据库回滚实现事务性
有问题吗?

阅读 5.3k
3 个回答

这种情况可以参考TCC(Try、Confirm、Cancel)思路。

多个数据存储想要通过单个事务来控制不可能了。要手动来控制

你先定义什么是一致性。。如果那个API有巨大的副作用,比如发射核弹,成功失败都不太可能回滚了

跨 mysql 和 redis 实现事务方案肯定很复杂啊,推荐最终一致性方案

最终一致性可以通过消息队列解耦来实现。基本思路:

@Transactional
doSomething{
    数据库写操作
    发送消息  
}

然后启动另外的服务接收消息

接收消息{
    redis 写操作   
}

需要注意的点:

  1. 数据库写操作要和发消息是事务性的,印象中 kafka 是有事务性消息的。
  2. 消息的顺序性:对同一条数据进行数据库修改,保证到 redis 写操作服务的顺序也是原来的修改顺序。
推荐问题
宣传栏