Redis支持简单的事务;
Redis与mysql事务对比:
— | mysql | redis |
---|---|---|
开启 | start transaction | muitl |
语句 | 普通sql | 普通命令 |
失败 | rollback回滚 | discard 取消 |
成功 | commit | exec |
注:rollback与discard的区别:
如果已经执行了两条语句,执行第三条是出错:
rollback前两句语句影响消失;
discard只是结束本次事务,前两句造成影响依旧存在;
在mutil后面的语句中,语句出错可能有2种情况:
1. 语法就有问题,这种exec时报错,所有语句得不到执行;
2. 语法本身没错,但适用对象有问题,比如 zadd操作list对象,exec之后,会执行正确语句,并跳过有不适当的语句;
redis事务中,启用的是乐观锁,只负责监测key是否有变动;
watch key1 key2 ... keyN
作用:监听key1 key2..keyN有没有变化,如果有变, 则事务取消
unwatch
作用: 取消所有watch监听
redis 127.0.0.1:6379> watch ticket
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> decr ticket
QUEUED
redis 127.0.0.1:6379> decrby money 100
QUEUED
redis 127.0.0.1:6379> exec
(nil) // 返回nil,说明监视的ticket已经改变了,事务就取消了.
redis 127.0.0.1:6379> get ticket
"0"
redis 127.0.0.1:6379> get money
"200"