回顾:数据库操作和redis缓存中的事务回滚问题

实际的开发场景:在一个需要根据id批量删除数据库中的数据,同时也要redis缓存中的数据。那么如何保证数据库操作与Redis缓存操作的一致性,在CRUD出错时,保证回滚。

问题:

1、数据库开启事务,即可在操作失误时,回滚之前的已经做过的操作,保证操作原子性。

2、Redis的事务并不支持回滚功能,Redis命令在事务处理期间发生错误,原先的操作并不会回滚

3、我们都知道,需要先操作数据库再操作缓存,这样大概率会避免并发和很多错误问题。但是MySQL操作成功,而Redis异常,此时缓存数据不一致,如何回滚Mysql操作又是一个问题。

解决方案:

1、在Service方法上使用spring的@Transactional注解回滚MySQL异常

注:@Transactional只会回滚MySQL的异常,其后发生的Redis异常并不会让其回滚数据库。Redis也不会回滚(这个和Redis采用的设计策略有关:不对回滚支持,保证操作的简单快速)

对Redis操作进行解耦,并且进行判断操作有无成功,如果出错,抛出unchecked异常(比如runtimeException)

这样:Redis出错,MySQL回滚的问题。配合@Transactional注解就解决了

而问题2 就需要根据自身的情况,对Redis中已经产生的数据进行删除即可。

reids解耦

https://blog.csdn.net/w1014074794/article/details/106071104

事务失效场景

https://blog.csdn.net/weixin_54401017/article/details/129598621

猜你喜欢

转载自blog.csdn.net/weixin_54401017/article/details/129708780