什么是事务?
很多件事情按顺序一起执行,都成功了,就算完成了事务,否则就恢复如初,像没有执行过一样。
SET A 1000
SET B 2000
DECRBY A 100 (step 1)
INCRBY B 100 (step 2)
如果step1政策执行,step2发生异常那么
A 结果为 900
B 结果为 1000
自认为正确的解决方式
MULTI
DECRBY A 100
INCRBY B 100
EXEC
然而实际上
MUlTI
SET a 100
INCRY b 1.22 (此行会报错)
SET a 200
EXEC
SET a 200 依然会被执行
MULTI 开始一个事务,将事务加入执行队列
EXEC 执行事务
Redis的事务并不是原子的,它并不支持回滚
使用DISCARD可以取消事务
MULTI
SET a 100
DISCARD
watch指令:
命令用于监视一个(或多个) key ,
如果在事务执行之前这个(或这些) key 被其他命令所改动,
那么事务将被打断
SET a 1
WATCH a
SET a 2
MULTI
SET a 3
EXEC
GET a
结果 : a = 2
因为之前执行了watch在后面的事务中,a的值将保持2,
使用UNWATCH可取消监控
网友评论