如果使用消息驱动的事务模式,一个方法里同时涉及到数据库,mq,redis三个数据源
来源:6-3 spring分布式事务实现_不使用JTA

慕标4341935
2020-05-26
比如秒杀场景使用redis做库存,同时又要调用优惠卷服务使用优惠卷,可能注定要开启redis事务,这样是不是违背了消息驱动的初衷
写回答
1回答
-
消息驱动的核心就是,把针对不同的数据存储的操作,在不同的事务里完成,不同的事物之间用消息中间件驱动。
但是,我们使用redis的时候,一般都是在一个方法里面即操作数据库,又操作redis,我们也不会把这两个操作分开。这时候就避免不了在一个数据库事务里面,开启一个redis的事务。那这就是参考最大努力一次提交,也就是在数据库事务提交之前,提交redis事务。
但是,我们还是尽量减少使用redis的事务,尽量使用redis的原子操作。在秒杀场景,我们可以将商品信息放在redis里面提供缓存,高速读取;然后对于商品秒杀数量,放在redis里,用一个incr的操作,每次有一个人购买,增加1,增加到超出商品数量就表明已经卖完了。这就相当于一个令牌桶的方式。
012020-06-03
相似问题