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

发布于 2022-09-11 16:39:19 字数 279 浏览 26 评论 0

一个 Service 方法里有三个操作

doSomething{

数据库写操作

redis 写操作

调用某 api

}

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

如果仅有redis和数据库操作

@Transactional
doSomething{

数据库写操作
redis 写操作   

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

岁月无声 2022-09-18 16:39:19

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

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

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

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

接收消息{
    redis 写操作   
}

需要注意的点:

  1. 数据库写操作要和发消息是事务性的,印象中 kafka 是有事务性消息的。
  2. 消息的顺序性:对同一条数据进行数据库修改,保证到 redis 写操作服务的顺序也是原来的修改顺序。
流云如水 2022-09-18 16:39:19

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

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

心房敞 2022-09-18 16:39:19

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文