一个 Service 方法里有三个操作
doSomething{
数据库写操作
redis 写操作
调用某 api
}
如何实现这个方法的事务性,或者最终一致性?
如果仅有redis和数据库操作
@Transactional
doSomething{
数据库写操作
redis 写操作
}
redis抛异常导致数据库回滚实现事务性
有问题吗?
一个 Service 方法里有三个操作
doSomething{
数据库写操作
redis 写操作
调用某 api
}
如何实现这个方法的事务性,或者最终一致性?
如果仅有redis和数据库操作
@Transactional
doSomething{
数据库写操作
redis 写操作
}
redis抛异常导致数据库回滚实现事务性
有问题吗?
跨 mysql 和 redis 实现事务方案肯定很复杂啊,推荐最终一致性方案。
最终一致性可以通过消息队列解耦来实现。基本思路:
@Transactional
doSomething{
数据库写操作
发送消息
}
然后启动另外的服务接收消息
接收消息{
redis 写操作
}
需要注意的点:
3 回答2.7k 阅读✓ 已解决
3 回答4.2k 阅读✓ 已解决
8 回答3.8k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
4 回答2.1k 阅读
这种情况可以参考TCC(Try、Confirm、Cancel)思路。
多个数据存储想要通过单个事务来控制不可能了。要手动来控制