redis事务管理
1. 说明
rdis是单线程,提交命令时,其它命令无法插入其中,轻松利用单线程实现了实务的原子性。
如果执行多个redis命令,事务就无法保证,于是redis有下列相关的redis命令来实现事务管理。
------------------------------------------------------------------------------------------------------------------
multi 开启事务
exec 提交事务
discard 取消事务
watch 监控,如果监控的值发生变化,则提交事务时会失败
unwatch 去掉监控
------------------------------------------------------------------------------------------------------------------
Redis保证一个事务的所有命令要么都执行,要么都不执行。如果在发送EXEC命令前客户端断线了,
则redis会清空事务队列,事务中的所有命令都不会执行。
而一旦客户端发送了EXEC命令,所有的命令都会被执行,即使此后客户端断线也没有关系,因为
redis中已经记录了所有要执行的命令。
2.1 exec提交事务
例如:模拟转账,王有200,张有700,张给王转100。过程如下:
set w 200
set z 700
mget w z
multi
decrby z 100 #注意此命令根本没有执行,而是把其放在一个队列中
incrby w 100
mget w z
get w #同时,这些相关的变量也不能再读取
get z
exec
2.2 如果有错误命令,自动取消
mget w z
1) "300"
2) "600"
multi
get w
set w 100
abc
(error) ERR unknown command 'abc'
exec
(error) EXECABORT Transaction discarded because of previous errors.
get w
2.3 discard取消事务(注意redis事务太简单,没有回滚,而只有取消)
mget z w
1) "600"
2) "300"
multi
incrby z 100
discard
get z
exec
(error) ERR EXEC without MULTI
浙公网安备 33010602011771号