考虑一个问题, Redis 如何 与 数据库保持一致性的问题.
举栗子: 如果我们在开发过程中遇到这样的一种情况, 我们删除 Redis 中 token 的同时 也需要修改数据库中 储存的 token 的状态为不可用的状态. 如果这个时候我们不做处理的话, 通常是先删除 Redis 中的 token, 然后在进行数据库的修改. 但是如果这个时候 Redis 中的 token 删除成功了, 但是在执行数据库操作之气程序报错了. 那这个时候 Redis 中的 token 已经被删除了, 但是数据库中的 token 状态还是可用的状态, 这个时候就导致了数据不一致的问题.
这时候我们需要使用统一的事务来进行解决这个问题,. 但是如果只是单纯的使用数据库事务并不能解决这个问题, 因为这个操作也涉及到了 Redis, 所以这个时候我们应该使用 Redis 事务 + 数据库的事务 来保证事务一致性的问题.
如果只是单纯添加了 @Transactional(声明式事务) 只能保证数据库的数据一致性问题, 但是是无法控制 Redis 中的事务的. Redis 中也是存在事务的.
解决方案:
我们可以使用自定义方法使用编程式事务 我们使用 begin(即控制 reids 事务也控制数据库事务),commit,rollback 都需要实现控制 Redis 事务和数据库事务.
来源: http://www.bubuko.com/infodetail-3115695.html