Redis的事务是一组命令的集合。事务同命令一样都是redis的最小执行单位,一个事务要么都执行,要么都不执行。使用multi命令告诉redis开始事务,然后正常操作redis,但是redis没有执行这些命令,而是返回queued表示命令已经进入等待执行的事务队列中。当把所有要在同一事务中执行的命令都发送给redis后,使用exec执行事务队列中所有的命令。如果发送exec之前客户端断线,redis会清空事务队列,事务中所有命令都不会执行。而一旦执行了exec命令,所有命令都会被执行,即时客户端断线也没挂系,因为redis记录了要执行的命令。除此之外,redis事务还能保证一个事务内的命令依次执行而不被其他命令插入。
redis和mysql事务对比
|
redis
|
mysql
|
开启
|
start transaction
|
mulit
|
语句
|
普通sql
|
普通命令
|
失败
|
rollback
|
discard取消
|
成功
|
commit
|
exec
|
127.0.0.1:6379> mget yhq qhh
1) "500"
2) "10000"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set yhq 600
QUEUED
127.0.0.1:6379> set qhh 9000
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> mget yhq qhh #命令全部正确执行
1) "600"
2) "9000"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set yhq 700
QUEUED
127.0.0.1:6379> set
(error) ERR wrong number of arguments for 'set' command #错误类型1
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set yhq 700
QUEUED
127.0.0.1:6379> sadd qhh 90000
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value #错误类型2
127.0.0.1:6379> mget yhq qhh
1) "700"
2) "9000"
错误类型1 语法错误 : 语法错误指命令不存在或者命令参数个数不对,成功的加入队列,只要有一个语法错误,执行exec命令后redis就会直接返回错误,连正确的命令也不会执行
错误类型2 运行错误 : 如果在事务里出现运行错误,事务里其他命令依然会继续执行(包括出错命令之后的命令)
watch监控命令
可以监控一个键或者多个键,一旦其中有一个键被修改或删除,之后的事务就不会执行,监控一直持续到exec命令(因为事务中的命令是在exec才执行的,所有在multi命令后可以修改watch监控的键值),执行exec命令后会取消所有键的监控,如果不想执行事务中的命令也可以使用unwatch命令来取消监控。
提示:由于watch命令的作用只是当被监控的键值被修改后阻止之后一个事务的执行,而不能保证其他客户端不修改这一键值,所有需要在exec执行失败后重新执行整个函数
127.0.0.1:6379> get yhq
"700"
127.0.0.1:6379> watch yhq
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set yhq 666
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get yhq
"666"
127.0.0.1:6379> watch yhq
OK
127.0.0.1:6379> set yhq 777
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set yhq 555
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get yhq
"777"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> watch yhq
(error) ERR WATCH inside MULTI is not allowed