场景:一段代码中有两处数据库操作(保存和更新,先保存后更新,两张表),保存数据库同时将数据保存到缓存,更新数据库时同时更新缓存。当更新数据库代码出现异常时,数据库可以使用事务的方式实现回滚,如果这时已经保存到缓存的数据怎么回滚?
当然可以在异常捕获中删除缓存,这样子有点粗暴...
如果是先更新后保存,缓存是不是回不去了?示意图我就不贴了,相信 V 站大神都能看懂
1
suyuanhxx OP 是不是节点选错了...
|
2
server 2016-12-01 11:11:52 +08:00
为啥已经要把缓存放到事务里
|
3
virusdefender 2016-12-01 11:14:23 +08:00
|
4
lrh3321 2016-12-01 11:21:31 +08:00
不是应该 更新 /保存 成功以后,再去更新缓存的吗?
|
5
est 2016-12-01 11:36:30 +08:00 1
|
7
suyuanhxx OP |
8
moro 2016-12-01 13:05:57 +08:00
redis 事务这章你看看能不能满足你的要求。
https://redis.io/topics/transactions |
9
jyf 2016-12-01 13:18:18 +08:00
mvvm
|
11
Mirana 2016-12-01 13:58:07 +08:00
先更新数据库 在更新缓存,要不会有并发一致性的问题
|
14
moro 2016-12-01 14:36:35 +08:00
先淘汰缓存,不能避免同时被读旧数据而载入缓存,还是会有脏数据。
|
15
MrJing1992 2016-12-01 15:01:18 +08:00
先淘汰缓存也有问题的。
|
16
suyuanhxx OP @Mirana 按照你的思路,写成功-》淘汰缓存-》如果更新失败-》数据库回滚,(如果更新成功也是一样)缓存一定 miss ,拉取数据库数据到缓存。那我们就要重新设计缓存思路,也就是只在读时将数据存到缓存,而且数据第一次被都读时缓存一定 miss 。或者将这一次存储时只存数据库。这样写代码不够优雅....(此处鬼脸)。如果先先更新,后保存就不适用了.....
|
17
suyuanhxx OP @moro 高并发时会有脏数据产生,在淘汰掉缓存后和更新时第二张表时此时发生读操作,就会产生脏数据。可以使用 redis 中的事务 watch key 防止此时的都操作产生的脏数据。
|
20
suyuanhxx OP @Mirana 如果保存和更新同时使用事务包裹,在这个事务执行时高并发情况下读的还是脏数据。而且我这个还是对整个 list 进行遍历读写....
|
22
HansCathy 2018-11-13 16:08:30 +08:00
两张表直接放两个事务啊,单事务会有问题
|