对于这个组合,会遇到这种情况:假设第二步更新数据库失败了,要求回滚缓存的更新,这时该怎么办呢?
Redis不支持事务回滚,除非采用手工回滚的方式,先保存原有数据,然后再将缓存更新回原来的数据。
缺陷:
如果原来缓存中的值是a,两个线程同时更新库存。
线程A将缓存中的值更新成b,且保存了原来的值a,然后更新数据库。
线程B将缓存中的值更新成c,且保存了原来的值b,然后更新数据库。
线程A更新数据库时失败了,它必须回滚,那现在缓存中的值更新成什么呢?
理论上应该更新成c,因为数据库中的值是c
但是,线程A里面无从获得c这个值。
所以最后缓存回滚回值a,而数据库中存储的值为c,两者不一致。