1 MULTI/EXEC
执行本事务。
MULTI
set foo bar
get foo
set foo hello
EXEC
在EXEC执行前,三条命令都放入队列中,然后EXEC触发执行。没有回滚,如果中间有命令失败,已经执行的命令不回滚,还没有执行的命令继续执行完。
2 MULTI/DISCARD
放弃本事务,事务中的命令一个也不会执行。
MULTI
set foo bar
get foo
set foo hello
DISCARD
三个命令都不会执行。
3 乐观锁
WATCH foo
MULTI
set foo bar
EXEC
如果在事务执行前,foo key有改动的话,事务停止执行。如果没有改动,继续执行。
因为redis是单线程的,实现起来比较简单,执行watch命令的时候,redis server会把该key放入watch列表中。
某个client在执行set操作的时候,如果修改了某个key,会通知所有watch该key的client,该key已经是dirty的了。
在exec执行的时候,会先去看是否有key被修改了,如果有的话,就丢弃本次事务,否则继续执行。
4 为什么redis不支持回滚
redis认为不会出现在生产环境中,不回滚更简单。